Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $http.jsonp()是如何工作的_Javascript_Json_Angularjs - Fatal编程技术网

Javascript $http.jsonp()是如何工作的

Javascript $http.jsonp()是如何工作的,javascript,json,angularjs,Javascript,Json,Angularjs,以下是.json文件的示例: [ { "name":"Jon Skeets" }, { "name":"Bill Joy" } ] 如果此json文件的获取方式为: $http.jsonp(pathToFile).then() { ... } 它返回一个404。pathToFile没有问题,我已经用curl、wget和浏览器验证了它。但是问题在于jsonp()必须获取具有上述结构的.json文件$http.get()可以解析具有上述结构的.j

以下是
.json
文件的示例:

[
  {
     "name":"Jon Skeets"
  },

  {
     "name":"Bill Joy"
  }
]
如果此json文件的获取方式为:

$http.jsonp(pathToFile).then() {
     ... 
}
它返回一个404。
pathToFile
没有问题,我已经用
curl、wget和浏览器验证了它。但是问题在于
jsonp()
必须获取具有上述结构的
.json
文件
$http.get()
可以解析具有上述结构的
.json
文件。但是
JSONP
cant。它需要顶层的字典,而不是数组

为了证明这一点,我创建了以下firebase:


在浏览器或wget中获取链接,它就会工作。尝试使用获取它,它返回404请求失败。

Firebase主机不支持JSONP。它不处理用于跨源计算JSONP回调的
回调
参数

假设您将此JSON存储在URL
http://example.com/name.json

{ "name":"Jon Skeets" }
如果您访问URL
http://example.com/name.json
您可以准确地返回JSON。这正是
$http.get
所做的

当服务器支持JSONP时,它接受
回调
参数。在这种情况下,URL以
http://example.com/name.json?callback=displayName
,响应为:

displayName('{ "name":"Jon Skeets" }');
这允许跨源检索JSON数据,这就是JSONP存在的全部原因

Firebase的动态数据服务器支持JSON。Firebase主机不支持

一些可能的解决办法:

  • 如果您将JSON文件和应用程序存储在Firebase主机上,则只需使用
    $http.get
  • 由于您控制JSON文件,因此也可以简单地在name.JSON中放入函数名
  • 将JSON文件存储在支持JSONP的主机上。我经常把它们放在Github注册表中
  • 将数据结构存储在Firebase分层数据库中,而不是存储在其托管服务器上

  • 您是否使用xampp/django/tomcat这样的服务器运行代码?@ArpitSrivastava:OP的上一个问题是在Firebase上。但是我已经能够使用
    $http.jsonp
    从Firebase获得这样一个结构,没有问题,如图所示:@ArpitSrivastava是的,我在使用Apache。@FrankvanPuffelen现在请看这个问题。我已经照你说的做了你是怎么把数据放进火库的?因为您的JSON返回的方式与我的完全不同:您知道有其他提供JSONP的托管提供商吗?我认为您在错误的框中键入了最后一个问题。谷歌是右边的一个标签。但我在最近的编辑中至少提供了一个选项。感谢您抽出时间回复。我现在不会打扰你了。如果可能的话,请您解释一下第二种选择。将函数名放在name.json中?json中的函数名意味着什么?myFuncName([{}])是这样的吗?是的。它(选项2)只是将.json文件转换为.js文件。但你为什么不选择选项1呢?如果您在同一台服务器上(不支持JSONP),那么对于简单、常规的
    get
    ,没有什么不合适的。