1
"fnServerData": function( sUrl, aoData, fnCallback, oSettings ) {
            oSettings.jqXHR = $.ajax( {
                "url": sUrl,
                "data": aoData,
                "success": fnCallback,
                "error":function(msg){
                    alert(msg);
                },
                "dataType": "jsonp",
                "cache": false
            } );
        },

当我提出该请求时,服务器会给出该响应。

Status Code: 200 OK
Cache-Control: max-age=0
Content-Language: en
Content-Type: application/javascript
Expires: Thu, 12 Jul 2012 06:23:18 GMT
Last-Modified: Thu, 12 Jul 2012 06:23:18 GMT
Vary: Accept-Language, Cookie

以及响应正文中的 json 数据。

但是 ajax 代码说它有一个错误,并进入“错误”代码块。

为什么它在状态为 200 时给出错误?

更新:

在 Django 服务器代码中:

            response_dict = {}                
            response_dict.update({'aaData': aaData})
            response_dict.update({'sEcho': sEcho, 'iTotalRecords': iTotalRecords, 'iTotalDisplayRecords':iTotalDisplayRecords, 'sColumns':sColumns})
            response = HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript')
4

1 回答 1

3

服务器响应是否包含带填充的 JSON?

你看,有两种方法可以从不同的域接收数据:

  1. CORS是新的,但需要Access-Control-Allow-Origin从服务器发送单独的标头。浏览器支持也有所限制。

  2. JSONP不依赖于服务器标头,而是要求它使用所谓的“填充”发回 JSON 数据:

    callback('{"your": ["json", "data"}')
    

    然后,您的 JavaScript 库(在本例中为 jQuery)将其包装到一个新script标签中,诱使您的浏览器对其进行评估。在这个callback函数中,jQuery 解析 JSON 数据并将其发送到您的fnCallback. 之后,它会script从页面中删除不必要的标签。一般来说,这是一个非常脆弱的解决方案,但它在实践中有效。例如,如果服务器不填充 JSON 数据,您最终会在标签内得到以下代码script

    '{"your": ["json", "data"}'
    

    请注意,它只是一个字符串,什么都不做。因此,请检查服务器是否发送包装的 JSON 而不是原始 JSON。我之前遇到过很多次同样的问题,这对我有帮助。


编辑:由于您发布了服务器端代码,我假设您可以修改它。我从来没有玩过 Django,但我会尝试给你一些提示:

  1. request您收到的内部应该有一个名为的参数callback- 这是 jQuery 发送给您的内容以及您应该用于填充的内容。把它放在某个地方:

    # Like I said I don't know the exact API but you get the idea
    callback = request.GET["callback"]
    
  2. 之后,在将您的回复发送给客户之前填充您的回复:

    response = HttpResponse( # Put callback name before the actual JSON
                   callback + "(" + simplejson.dumps(response_dict) + ");", 
                   mimetype='application/javascript')
    

这应该有效。

于 2012-07-12T07:09:10.663 回答