$http.json()是如何工作的

How does $http.jsonp() work

本文关键字:工作 何工作 http json      更新时间:2023-09-26

以下是.json文件的示例:

[
  {
     "name":"Jon Skeets"
  },
  {
     "name":"Bill Joy"
  }
]

如果这个json文件被获取为:

$http.jsonp(pathToFile).then() {
     ... 
}

它返回一个404。pathToFile没有问题,我已经用curl, wget and the browser验证过了。但是问题在于jsonp()必须获取具有上述结构的.json文件。$http.get()可以解析具有上述结构的.json文件。但JSONP不能。它需要一个顶级的字典,而不是一个数组。

为了证明这一点,我创建了这个燃烧基地:https://blazing-fire-6512.firebaseapp.com/name.json

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

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

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

{ "name":"Jon Skeets" }

如果您访问URL http://example.com/name.json,那么您会得到确切的JSON。这正是$http.get所做的。

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

displayName('{ "name":"Jon Skeets" }');

这允许跨源检索JSON数据,这就是JSONP存在的全部原因。

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

一些可能的解决方案:

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