我的回调不适用于跨域的 json 数据
Posted
技术标签:
【中文标题】我的回调不适用于跨域的 json 数据【英文标题】:my callback not working for json data from cross domain 【发布时间】:2017-01-18 08:30:31 【问题描述】:我正在使用 ajax 调用使用“jsonp”数据类型从跨域 url 获取 json 数据,但调用错误函数。我可以在 mozilla 开发人员 -> 网络 -> 即将到来的响应中看到 json 数据。下面是代码:
$(document).ready(function()
$.ajax(
url : 'https://www.example.com /fetchdata?param=1',
type : 'POST',
crossDomain : true,
dataType : 'jsonp',
headers :
'Access-Control-Allow-Origin' : '*',
'Access-Control-Allow-Methods' : 'POST'
,
jsonpCallback : 'callbackdata',
success : function(data)
alert("success");
,
error : function(xhr, status, error)
console.log(error);
alert("fail");
,
);
);
function callbackdata(response)
alert(response)
出现以下错误:
Error: callbackdata was not called
Stack trace:
.error@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:2:1821
b.converters["script json"]@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:4:16101
uc@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:4:7333
x@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:4:10747
.send/c@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:4:15393
n.event.dispatch@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:3:6392
n.event.add/r.handle@http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js:3:3202
CORS:25:7
SyntaxError: missing ; before statement
和在 Mozilla daveloper 中的响应-> 网络
"datapoints": ["record_timestamp": "10-09-2016 05:30","data": "temperature": "id": "3","param_name": "temperature","value": "28.6","unit": "celsius"]
json 数据不包含 jsonpcallback。请帮助我找到解决方案。
如果我尝试使用“json”作为数据类型而不是“jsonp”进行 ajax 调用,服务器会响应
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.example.com/fetchdata?param=1.(Reason: CORS header 'Access-Control-Allow-Origin' missing)
【问题讨论】:
【参考方案1】:您请求的服务器需要设置 CORS 标头,因此无论您的 example.com
是什么,都需要设置其服务器以提供 Access-Control-Allow-Origin "*"
标头。把它放在你的 AJAX 请求中不会有效果。
【讨论】:
【参考方案2】:您从中请求数据的服务器返回 JSON,而不是 JSONP。服务器必须支持 JSONP,这要求它返回 javascript 代码,而不是纯 JSON。
例如:
JSON 是:
"\"message\":\"hello world\""
JSONP 是:
callback(message:"hello world")
当提供“回调”URL 参数时,服务器将返回 JSONP 脚本(jQuery 会为您执行此操作)。
除非此特定服务器支持此功能,否则不会调用您的回调。
虽然不是 jQuery 问题,this Q&A 涵盖了相同的主题。
【讨论】:
感谢您的回复。我了解 JSON 和 JSONP 的区别,但是如果 data(json) 来自第三方 url,那么我该如何更改为 JSONP 以及服务器如何支持 JSONP 。请帮忙。我在谷歌上没有得到任何东西。 第三方服务器必须支持。如果确实如此,它将识别您拨打的电话。既然没有,而且你得到这个错误,这意味着第三方不支持 JSONP 好的。我们假设服务器不支持 JSONP。那么在这种情况下可能的替代方案是什么。你能给我解决办法吗? 如果您无法控制服务器或无法联系所有者更改其设置,则没有解决方案。有时问题的正确答案就是这样。以上是关于我的回调不适用于跨域的 json 数据的主要内容,如果未能解决你的问题,请参考以下文章