14

ウィキペディアからJSONとしていくつかのコンテンツを取得しようとしました:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json", function(data) {
    doSomethingWith(data);
});

しかし、私は何の反応もありませんでした。ブラウザのアドレスバーに貼り付けると、次のようになります。

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=jQuery&format=json

期待通りのコンテンツが得られます。どうしたの?

4

4 に答える 4

31

次のようにクエリ文字列$.getJSON()を追加して、でJSONPの動作をトリガーする必要があります。&callback=?

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?", function(data) {
    doSomethingWith(data);
});

ここでテストできます

JSONPを使用しないと、XmlHttpRequestがデータを取り戻すのをブロックしている同一生成元ポリシーに到達します。

于 2010-10-06T14:39:05.937 に答える
3

他の回答が指摘しているように、あなたはクロスドメインリクエストを行っています。

現在機能していて、両方が与えている1つの答えは、JSONPの代わりに使用することですが、クロスオリジンリソースシェアリングJSONと呼ばれる別の答えがあります。CORS

ただし、CORSはMediaWikiでサポートされていますが、ウィキペディアのキャッシングとの微妙な違いにより、ウィキペディアではまだ有効になっていません。

ウィキペディアでこれを機能させるための未解決のバグレポートがあります:ウィキメディアサイトの$wgCrossSiteAJAXdomainsを有効にします

これが解決されると、CORSをサポートするブラウザーからのJSONPを必要とせずに、ウィキペディアに対してクロスドメインAJAXリクエストを行うことができるようになります。すべての主要なブラウザの最新バージョンがCORSをサポートするようになりました。Internet Explorerの場合、これはバージョン10を意味し、多くの人が実行していません。バージョン9には、あまり人気がなかったと呼ばれる代替ソリューションがあります。

于 2012-03-12T09:06:41.863 に答える
0

getJSONP別のドメインからデータを取得する場合は、それを「同一生成元ポリシー」の一部として使用する必要があります。

編集

実際、ニックが言っ&callback=?たことは、クエリ文字列の最後を叩いてを呼び出すことgetJSONPです。

于 2010-10-06T14:39:03.550 に答える
0

JSONPの代わりにCORSリクエストを実行する1つのオプションはorigin=*、リクエストURLにパラメータを明示的に含めることです。次に例を示します。

var title = "jQuery";

$.getJSON("https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&origin=*", function(data) {
    console.log(data.query.pages);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2017-12-09T15:02:26.470 に答える