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 が含まれていますか?

ご覧のとおり、異なるドメインからデータを受信するには 2 つの方法があります。

  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 に答える