AJAX JSONP失败返回状态文本“成功”,正确的回调

0 投票
2 回答
510 浏览
提问于 2025-04-18 14:26

我知道这个问题之前有人问过,但我还是搞不明白。我有一个 IIS 6.0 服务器在运行一个 Python 脚本。这个 Python 脚本返回的内容是……它把一个字典列表转换成一个 JSON 对象,设置好头信息,然后返回数据。

try:
    name
    allergy = json.dumps(sorted(var_allergies, key=operator.itemgetter('name'),reverse=True))    
    print "Content-type: application/json"
    print
    print allergy

My ajax call is: 
    function AllergyPyJSON() {
        var url ="http://hostname/cgi-bin/allergies.py?callback=?"
        $.ajax({
            type: "GET",
            url: url,
            data: { 'user_id': $('#user').val() },
            cache: false,
            async: false,
            jsonpCallback: 'jsonCallback',
            jsonp: true,
            dataType: 'jsonp', 
            contentType: "application/json; charset=utf-8",   
            success: function (json) {           
                alert(json)
            }
        }).done(function (r) {
            //alert('done');
        }).fail(function (r) {
            alert(JSON.stringify(r));
        })
    }

但是响应却进入了失败的方法。

{"readyState:4,"status":200,"statusText":"success"}

如果我使用调试工具,或者在 Chrome 的控制台 - 网络选项卡中查看……我能看到请求和响应的内容。

[{"date": "2014-02-20 10:49:47", "reaction": "None", "name": "Dilantin"}]

所以它确实在调用这个函数,并且返回了正确的数据。那我该如何在回调中访问这些数据呢?或者说,为什么会失败但仍然返回数据呢?

编辑:这里是返回的头信息。

Remote Address:100.100.200.200:80
Request URL:http://server/cgi-bin/allergies.py?callback=?&pat_id=0009689&_=1406123902467
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:hh-borpt
Referer:http://localhost:42972/Forms/page.htm
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Query String Parametersview sourceview URL encoded
callback:?
pat_id:0009689
_:1406123902467
Response Headersview source
Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Access-Control-Allow-Origin
Connection:close
Content-Type:application/json
Date:Wed, 23 Jul 2014 13:58:20 GMT
Server:Microsoft-IIS/6.0

编辑:我搞明白了:我需要在我的 AJAX 调用中加入 jsonpCallback: 'jsoncallback'

在 Python 这边

print "Content-type: application/json"
print
print "jsonCallback(%s)" % allergy

现在它返回的数据被包裹在一个函数中(加了一层),这样就能正常工作了。成功的函数会返回一个 JSON 对象。

jsonCallback({"date": "2014-02-20 10:49:47", "reaction": "None", "name": "Dilantin"})

2 个回答

0

你提到的 'JsonPCallback' 到底在哪里?你说回调函数应该叫 'JsonCallback',但你在帖子里没有包含这个函数。试着去掉那一行,直接让 json 数据流向你已经写好的成功处理方法。

可以试试这个:

function AllergyPyJSON() {
    var url ="http://hostname/cgi-bin/allergies.py?callback=?"
    $.ajax({
        type: "GET",
        url: url,
        data: { 'user_id': $('#user').val() },
        cache: false,
        async: false,
        jsonp: true,
        dataType: 'jsonp', 
        contentType: "application/json; charset=utf-8",   
        success: function (json) {           
            alert(json)
        }
    }).done(function (r) {
        //alert('done');
    }).fail(function (r) {
        alert(JSON.stringify(r));
    })
}
0

更新:我搞明白了,我在ajax调用中需要加上jsonpCallback: 'jsoncallback'。

在我的Python代码中,我还得把函数名放在json对象的周围。

print "Content-type: application/json"
print
print "jsonCallback(%s)" % allergy

现在它返回的数据被包裹在一个函数里(加了一层),这样就能正常工作了。成功的函数会返回一个json对象。

jsonCallback({"date": "2014-02-20 10:49:47", "reaction": "None", "name": "Dilantin"})

撰写回答