0

現在、Chrome のユーザー スクリプト/拡張機能に取り組んでおり、「ある Web サイト」から JSON データを取り込もうとしています。これが私のアプローチでした:

$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", 
       function( data ) { console.log( data ); } 
);

もちろん、それは次のエラーにつながります。

XMLHttpRequest はhttp://cloud.hartwig-at.de/~oliver/superuser.jsonを読み込めません。Origin http://superuser.comは Access-Control-Allow-Origin で許可されていません。

Origin 'url' is not allowed by Access-Control-Allow-Origin (他の質問の中でも)を読んだ後、解決できました。したがって、これは次のバージョンです。

$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", 
       function( data ) { console.log( data ); }, 
       "jsonp" 
);

悲しいことに、別のエラーが発生します。

キャッチされていない SyntaxError: 予期しないトークン: (superuser.json:2)

また、「リソースはスクリプトとして解釈されましたが、MIME タイプ text/plain で転送されました:」という警告も表示され、問題の原因がすでにわかっていました。(さらに詳細はChrome から提供され、「リソースはスクリプトとして解釈されましたが、MIME タイプ text/plain で転送されました。」と表示されましたが、何が得られますか? )

どうやら、HTTP サーバーは私のファイルに適切な MIME タイプを送信する必要があるようapplication/jsonです。

さて、必要な変更をすぐに追加してmime.types、もう一度やり直しました。しかし、サイコロはありません!警告は消えましたが、エラーは消えませんでした。私はまだ得Uncaught SyntaxError: Unexpected token :ます。(これを修正するために以前にmimeTypeパラメーターを利用しようとしたこともありましたが、結果は同じでした。)

ただし、MIME タイプは正常に見えます。
ここに画像の説明を入力

今、私はややアイデアがありません。ファイルの内容はhttp://www.jslint.com/.jsonで正常に検証されます

4

2 に答える 2

2

jQuery に JSONP を実行するように指示しても、魔法のように機能するわけではありません。JSONP リクエストを作成しますが、相手側のサーバーは JSONP 呼び出しをサポートする必要があります。

サーバーからの応答は次のようになります。

someFunction( { "foo" : "bar" } );

コールバックの使用方法については、JSONP を使用した getJSON に関する jQuery のドキュメントを参照してください。

最新のブラウザーであれば、CORSを使用でき、2 番目のドメインを制御できます。

他のオプションは、他のドメインからのデータを要求するドメイン上のサーバー側プロキシです。または、 Yahoo パイプなどのサービスを使用することもできます。

于 2013-01-08T19:37:44.770 に答える
1

サーバーがJSONPをサポートしていない限り、リクエストでJSONPを使用することはできません。JSONP呼び出しが機能する方法はcallback=something、リクエストとともにパラメーターを渡し、サーバーがJSONをカプセル化して、スクリプトにアクセスしたときにsomething()呼び出すことでブラウザーがJSONをロードできるようにすることです。something

ドメインを所有している場合、それを機能させる別の方法は、CORSヘッダーを正しく設定するようにサーバーを構成することです。

サーバーにアクセスできない場合は、最初のステップをラップするJSONPプロキシの使用を検討してください。私はこれを行うためにYQLを使用しました(リンクを参照)。これには、自分で何も設定する必要はありません。以下はそれを行うcoffeescriptコードです:

uri = "http://cloud.hartwig-at.de/~oliver/superuser.json"      

jqxhr = $.getJSON \
  "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" \
    + encodeURIComponent(uri) + "%22&format=json&callback=?"  

jqxhr.success (yql) ->
  unless yql.query.results
    alert("Failed to get stuff")
    return      
  json = $.parseJSON(yql.query.results.body.p)
  # do stuff with json

そして、http://js2coffee.orgを使用したjavascriptの形式

uri = "http://cloud.hartwig-at.de/~oliver/superuser.json";

jqxhr = $.getJSON("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"
        + encodeURIComponent(uri) + "%22&format=json&callback=?");

jqxhr.success(function(yql) {
  var json;
  if (!yql.query.results) {
    alert("Failed to get stuff");
    return;
  }
  json = $.parseJSON(yql.query.results.body.p);
  // do stuff with json
});
于 2013-01-08T19:42:10.700 に答える