$ .getJSON得到了响应,但是console.log不会输入它

时间:2013-02-04 14:47:32

标签: jquery json jsonp

我使用以下jQuery从x-server获取一些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})

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

2 个答案:

答案 0 :(得分:4)

当你的网址中有jsoncallback=?时,服务器正在回答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=?来解决您的问题。

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

答案 1 :(得分:1)

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

在响应中丢失{J}周围的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})