0

我使用以下 jQuery 从 x 服务器获取一些 JSON:

$(function(){
    $.getJSON("/json.php?method=getStupid&jsoncallback=?",
        function(json){
            console.log('Success: ' + json);
        }
    );
});

每个浏览器的控制台都是空的,但是当我检查网络选项卡时,它似乎一切正常。

HTTP/1.1 200 OK
Date: Mon, 04 Feb 2013 14:14:01 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze9
Cache-Control: no-cache, must-revalidate
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Content-Length: 33
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: application/json

这就是响应的样子:

({"a":1,"b":2,"c":3,"d":4,"e":5})

感觉 function(json) { } 中的所有内容都被忽略了。是错字吗?

4

2 回答 2

4

正如您jsoncallback=?在 URL 中所看到的那样,服务器正在使用 JSONP 进行响应。

服务器正在尝试构建

functionName({"a":1,"b":2,"c":3,"d":4,"e":5})

并且由于getJSON没有给出函数名称,因此您以

({"a":1,"b":2,"c":3,"d":4,"e":5})

这不是 JSON。

您可以通过jsoncallback=?从 URL 中删除来解决您的问题。

如果服务器只能以 JSONP 回答(我对此表示怀疑),那么您最好使用通用的$.ajax函数。

于 2013-02-04T14:51:51.993 回答
1

您正在附加jsoncallback=?,这意味着您正在请求 JSONP。这用于跨域通信。如果此 URL 在您的域中,则只需使用 JSON。

丢失响应中 JSON的jsoncallback=?, 和. ()那么它将是有效的 JSON。

如果需要使用 JSONP,则需要正确格式化请求。

首先,JSONP不是JSON。它实际上是附加到页面的脚本标签。所以,它Content-type应该是text/javascript

其次,jsoncallback参数很重要。发回响应时,您需要将数据“包装”在该参数的值中。

因此,如果请求是/json.php?method=getStupid&jsoncallback=test123,则响应应该是:

test123({"a":1,"b":2,"c":3,"d":4,"e":5})
于 2013-02-04T14:53:29.587 回答