0

次のjQueryを使用して、xサーバーから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})

function(json){}内のすべてが無視されているように感じます。タイプミスですか?

4

2 に答える 2

4

URLにあるよう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=?URLから削除することで、おそらく問題を解決できます。

サーバーがJSONPでしか応答できない場合(これは疑わしいです)、汎用の$.ajax関数を使用することをお勧めします。

于 2013-02-04T14:51:51.993 に答える
1

を追加jsoncallback=?しています。これは、JSONPをリクエストしていることを意味します。これは、クロスドメイン通信にのみ使用されます。このURLがドメインにある場合は、JSONを使用してください。

応答のJSONjsoncallback=?とその周辺を失います。()その後、有効な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})
于 2013-02-04T14:53:29.587 に答える