$ http.jsonp()如何工作

时间:2014-08-30 13:50:22

标签: javascript json angularjs

以下是.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不能。它需要顶层的字典而不是数组。

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

在您的浏览器或wget中获取链接并且它可以正常工作。尝试使用Angular here获取它并返回404请求失败。

1 个答案:

答案 0 :(得分:1)

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

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

{ "name":"Jon Skeets" }

如果您访问网址http://example.com/name.json,则会获得该JSON。这正是$http.get所做的。

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

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

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

Firebase的动态数据服务器支持JSON。 Firebase托管没有。

一些可能的解决方案:

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