【问题标题】:Cross domain $.getJSON not firing the success function跨域 $.getJSON 未触发成功功能
【发布时间】:2012-10-31 20:14:07
【问题描述】:

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

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

【问题讨论】:

  • 你能分享你响应返回的json吗?
  • 我刚刚看到你的更新响应头。请看看我的编辑。

标签: jquery json cross-domain getjson


【解决方案1】:

正如您清楚地看到这是一个跨域请求,我想您至少知道一点the same origin policy

简而言之,如果您没有在appspot.com 服务器上设置the appropriate CORS headers,那么浏览器就没有理由允许脚本分析结果。好消息是,在几乎所有服务器端语言中,it's very easy to add the relevant headers。当然这意味着您可以更改服务器(或者浏览器将其视为服务器,它可能是代理)。


编辑:

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

【讨论】:

  • 我去掉了参数,结果还是一样。警报没有触发
【解决方案2】:

谈到 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;

如果没有更多信息,我将无法更有用:)

【讨论】:

  • 我添加了这些标题,但仍然是同样的问题
  • 您也可以分享请求标头吗?您是否已经尝试过使用 $.ajax 而不是 $.getJSON?根据我的经验,我使用了 $.ajax,我遇到的唯一问题是请求/应答标头。
【解决方案3】:

也添加这个

Access-Control-Max-Age: 3600

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

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多