我使用以下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){}中的所有内容都被忽略了。这是一个错字吗?
答案 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})