跨域$ .getJSON未触发成功函数

时间:2012-11-12 11:46:04

标签: jquery json cross-domain getjson

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

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

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

  1. 我在服务器上看到
  2. 我在网络标签中看到了响应代码和正文
  3. 当我尝试返回格式错误的JSON时,我确实收到错误。
  4. 但在任何情况下我都没有在成功函数中获得警报

    在几个页面上尝试使用不同版本的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
    

3 个答案:

答案 0 :(得分:1)

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

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


编辑:

我刚刚注意到您调用的网址中的callback=?。这意味着您在JSONP中调用服务,而不是JSON(跨域问题的过时解决方案)。由于它不能与回调语法一起使用,并且响应头包含application/json,您可能会尝试查看它是否处理普通json。请尝试在网址末尾没有?callback=?

答案 1 :(得分: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;

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

答案 2 :(得分:0)

同时添加

Access-Control-Max-Age: 3600

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