我的回调不适用于跨域的 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

跨域不适用于 Spring Boot

JSONP实现跨域

处理跨域的方法

如何解决跨域问题

跨域的几种方法

javascript跨域的几种方法