使用JQuery的Ajax:200 ok,但不是“成功”

时间:2012-02-20 15:40:49

标签: jquery json cross-domain jsonp

我在尝试跨域请求时遇到了同样的问题。情况很奇怪,我的数据在浏览器上直接点击请求的URL时被加载,奇怪的是,如果使用jquery ajax请求,这也会被加载, 但不是在firebug 控制台上,而是在firebug net 标签上。 控制台打印: 错误数据示例: parsererror {而json数据格式正确,格式化,在json验证器上检查}

readyState: 4 status: 200 responseText: undefined

标签加载响应 json 子标签中的所有数据

我的示例代码是:

function fetchJsonData() {
$.ajax({
    type: 'POST',
    url: 'http://www.meilleurmobile.com/comparateur/resultats-comparateur-json.do',
    data: 'monthDur%5B0%5D=45.75&monthDur%5B1%5D=45.75&monthDur%5B2%5D=45.75&monthDur%5B3%5D=45.75&monthDur%5B4%5D=45.75&monthDur%5B5%5D=45.75&monthDur%5B6%5D=45.75&monthDur%5B7%5D=45.75&monthDur%5B8%5D=45.75&monthDur%5B9%5D=45.75&monthDur%5B10%5D=45.75&monthDur%5B11%5D=45.75&numSms=1000&dataVolume=1000&withoutMobile=-1&commitmentDuration=-1',
    async: false,
    cache: false,
    //contentType: 'application/json; charset=utf-8',
    crossDomain: true,
    dataType: 'jsonp',
    error: function( xhr,err ) {
        console.log( 'Sample of error data:', err );
        console.log("readyState: "+xhr.readyState+"\nstatus: "+xhr.status+"\nresponseText: "+xhr.responseText);
    },
    success: function( data ) {
        if (console && console.log) {
            console.log( 'Sample of data:', data.slice(0,100) );
        }
    }
})
.done(function() { alert("success"); })
.fail(function() { alert("error"); });

}

3 个答案:

答案 0 :(得分:4)

尝试跨域XMLHttpRequest请求可能会欺骗您。在Firefox Web控制台中,它可能看起来像URL加载正常,但是body是一个空字符串。

确认服务器支持JsonP。如果你真的不知道这意味着什么,你需要查阅它。这非常重要。

jQuery假设JsonP参数将是"?callback ="。如果不是这样,您应该看到:http://api.jquery.com/jQuery.ajax/

  

jsonp:覆盖jsonp请求中的回调函数名称。这个值   将被用来代替回调'在'回调=?'的一部分   在url中查询字符串。所以{jsonp:' onJSONPLoad'}会导致   ' onJSONPLoad =&#39?;传递给服务器。从jQuery 1.5开始,设置   jsonp选项为false可防止jQuery添加"?callback"   字符串到URL或尝试使用" =?"转型。在   在这种情况下,您还应该显式设置jsonpCallback设置。   例如,{jsonp:false,jsonpCallback:" callbackName" }

     

jsonpCallback:指定JSONP请求的回调函数名称。这个值   将用于代替自动生成的随机名称   jQuery的。最好让jQuery生成一个唯一的名称,因为它是&#l; ll   使管理请求更容易,并提供回调和错误   处理。您可能希望在要启用时指定回调   更好的浏览器缓存GET请求。从jQuery 1.5开始,你也可以   使用一个函数进行此设置,在这种情况下的值为   jsonpCallback设置为该函数的返回值。

如果它变得令人困惑,可能更容易以旧式方式执行它并自己将脚本附加到页面中,并在URL中添加时间戳以避免使用缓存的脚本页面。

BTW,AFAIK,没有办法将JSONP和POST结合起来。 JSONP是一种解决XMLHttpRequest相同原始安全策略的方法。它要求您将脚本附加到DOM。我不认为你可以做到这一点,并提交POST变量作为整个过程的一部分。

答案 1 :(得分:0)

尝试

 console.log(data);

没有切片。

或者,甚至更好

 console.log(JSON.stringify(data.slice(0,100)));

使用JSON.stringify()(记录的here)方法得到一个未解析或检查json有效性的字符串。

希望这会有所帮助。

答案 2 :(得分:0)

function fetchJsonData() {
$.ajax({
    type: 'POST',
    url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%20%3D%20'www.meilleurmobile.com%2Fcomparateur%2Fresultats-comparateur-json.do%3FmonthDur%255B0%255D%3D45.75%26monthDur%255B1%255D%3D45.75%26monthDur%255B2%255D%3D45.75%26monthDur%255B3%255D%3D45.75%26monthDur%255B4%255D%3D45.75%26monthDur%255B5%255D%3D45.75%26monthDur%255B6%255D%3D45.75%26monthDur%255B7%255D%3D45.75%26monthDur%255B8%255D%3D45.75%26monthDur%255B9%255D%3D45.75%26monthDur%255B10%255D%3D45.75%26monthDur%255B11%255D%3D45.75%26numSms%3D1000%26dataVolume%3D1000%26withoutMobile%3D-1%26commitmentDuration%3D-1%26_%3D1329825461536'&format=json&diagnostics=true",
    async: false,
    cache: false,
    crossDomain: true,
    dataType: 'jsonp',
    error: function( xhr,err ) {
        console.log( 'Sample of error data:', err );
        console.log("readyState: "+xhr.readyState+"\nstatus: "+xhr.status+"\nresponseText: "+xhr.responseText);
    },
    success: function( data, status ) {
        if (console && console.log) {
            console.log( 'data count:', data.query.results.json.json.length );
            $('#result-count').text( JSON.stringify(data.query.results.json.json) );
        }
    },
    jsonpCallback: 'swatCallback'
})
.done(function() { alert("success"); })
.fail(function() { alert("error"); }); 
}


window['swatCallback'] = function(data) {
    var info = data.query.results.json.json;
    $('#callback_result_operator').html(info[0].operator);
};