25

そのため、次のjQueryコードを使用してStackExchangeAPIにリクエストを送信しようとしています。

$.ajax({                                                                                                                                                                                                        
    type: 'POST',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); }                                                                                                                                                              
});   

しかし、FireFoxまたはChromeのいずれかで自分のマシンでファイルを開き、リクエストを行うと、次のエラーが発生します。

Resource interpreted as Script but transferred with MIME type application/json.
Uncaught SyntaxError: Unexpected token :
Uh Oh!

何が起こっているのか分かりません。Stack Exchange APIがその応答をGzipすることを知っていますが、これにより問題が発生しますか?

4

2 に答える 2

21

SO APIを機能させるには、型にはまらないパラメータを設定する必要があります。従来のではなくcallback、パラメータを渡す必要がありjsonpます。

POSTさらに、 JSONPではできません。

$.ajax({                                                                                                                                                                                                        
    type: 'GET',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); },
    jsonp: 'jsonp'                                                                                                                                                
});

従来のXMLHTTPRequestを使用してクロスドメインAJAXを実行することはできません。これはセキュリティ上の理由からです(同一生成元ポリシーと呼ばれます)。

回避策があります。 scriptタグはこの制限の対象ではありません。scriptこれは、URLを呼び出すタグをドキュメントに挿入できることを意味します。スクリプトでグローバルにアクセス可能な関数を定義し、その関数が何と呼ばれるかをリモートサーバーに伝えると、サーバーは、その関数の呼び出しで送信されるデータをラップするコードを渡すことができます。

ここでの問題は、StackOverflowAPIにあります。従来はcallback、リクエストで引数を使用して、関数が何と呼ばれるかをサーバーに通知していました。ただし、StackOverflowのAPIは、jsonp代わりにパラメーターを使用するように要求します。

于 2011-05-18T14:11:53.257 に答える
4

このURLを試してください:http ://api.stackoverflow.com/1.1/stats?jsonp = callme

「callme」は、グローバル名前空間(ウィンドウオブジェクト)内のコールバック関数の名前です。

ちなみに、Firefoxを実行していて、JSONViewアドオンがインストールされている場合は、上記のURL(および比較のために自分のURL)を直接テストできます。

URLを呼び出した結果:

callme({
  "statistics": [
...
  ]
})
于 2011-05-18T14:12:49.167 に答える