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存储在URLhttp://example.com/name.json
:
{ "name":"Jon Skeets" }
如果您访问URLhttp://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
,没有什么不合适的。