1

这让我很困惑。我正在发送一个跨域请求,我确定该请求正在通过并成功返回,但成功函数没有被触发。我没有看到任何警报...

jQuery.getJSON('http://xxxx.appspot.com?callback=?', function(json) { 
    //console.log(json);
    alert ('text');
  });

我有几个迹象表明请求成功:

  1. 我在服务器上看到
  2. 我在网络选项卡中看到响应代码和正文
  3. 当我尝试返回格式错误的 JSON 时,我确实收到了错误。

但在任何情况下,我都不会在成功功能中收到警报

使用不同版本的 jQuery 在几个页面上进行了尝试。

更新:所以我启用了标题,结果仍然完全相同。警报没有触发。

这是响应的标题:

HTTP/1.1 200 OK
Content-Type: application/json; charset=ISO-8859-1
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin,SOAPserver,SOAPaction,Method,Accept,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Mon, 12 Nov 2012 12:30:02 GMT
Server: Google Frontend
Cache-Control: private
Content-Length: 36
4

3 回答 3

1

正如您清楚地看到它是一个跨域请求,我想您至少知道一点同源策略

简而言之,如果您没有在服务器上设置适当的 CORS 标头appspot.com,则浏览器没有理由允许脚本分析结果。好消息是,在几乎所有服务器端语言中,添加相关的标头都非常容易。当然这意味着您可以更改服务器(或者浏览器将其视为服务器,它可能是代理)。


编辑 :

我注意到刚才callback=?在您调用的 URL 中。这意味着您在 JSONP 中调用服务,而不是 JSON(跨域问题的过时解决方案)。由于它不适用于回调语法并且响应标头包含application/json,因此您可能会尝试查看它是否处理纯 json。?callback=?在 URL 的末尾尝试不使用。

于 2012-11-12T11:48:14.370 回答
0

当谈到 CORS(跨源资源共享)时,它都是关于标头的。

您的请求标头和答案标头是否正确非常重要,否则它将不起作用。

如果您的请求标头不正确,则请求将被服务器无情地杀死。如果答案标题不正确,浏览器客户端将忽略答案。

在答案中,您应该找到以下标头子集:

  • 访问控制允许来源
  • 访问控制允许凭据
  • 访问控制允许方法
  • 访问控制允许标头

请求使用的所有来源、方法和标头都必须在服务器应答中允许,否则将被忽略。

例如:

Access-Control-Allow-Origin *;
Access-Control-Allow-Credentials true;
Access-Control-Allow-Methods GET, POST, OPTIONS, PUT, DELETE;
Access-Control-Allow-Headers Origin,SOAPserver,SOAPaction,Method,Accept,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type;

没有更多信息,我不能更有用:)

于 2012-11-12T11:57:06.957 回答
0

也添加这个

Access-Control-Max-Age: 3600

另外,检查Access-Control-Request-Method浏览器请求。

于 2013-07-30T09:47:55.467 回答