web-dev-qa-db-ja.com

JSON:クロスドメインJSON呼び出しを行う方法

ローカルネットワークで次のjqueryコードを実行してみます。

 $.ajax({
     type: "GET",
     url: "http://SomeSite/MyUrl/",
     cache: false,
     data: { ... },
     dataType: "json",

     error: function (xhr, status, error) {
                                    ... 
     },
     success: function (json) {
                                    ...
     });

「SomeSite」がローカルホストになるまで、すべてが正常に機能します。ページがダウンロードされたのと同じサーバーを意味します。

しかし、「SomeSite」が別の(localhostではない)ネットワークサイトである場合、リクエストがハングしたように見えます。 「エラー」も「成功」コールバック関数も呼び出されません。このコードを機能させるにはどうすればよいですか?

前もって感謝します!

11
Andrew Florko

「SomeSite」へのサーバーアクセス権はありますか、それともサードパーティですか?

  • アクセス権がある場合は、CORSを有効にできます wphome その上に。最も単純な形式(データはセッションに依存しない)で、ヘッダーを追加するだけです:Access-Control-Allow-Origin: *

  • アクセス権がない場合、JSONPがサポートされているかどうかはわかりますか wpso?これには通常、URLで少なくともcallbackパラメータを渡す必要があります。 (もちろん、アクセス権があれば、JSONPサポートも追加できます。)

  • 「SomeSite」に変更を加えるアクセス権がなく、CORSJSONPもサポートしていない場合は、YQLを使用できる可能性があります wphome プロキシとして。 CORSJSONPの両方をサポートし、データ形式の変換、データの一部の選択なども可能です。
    (YQLはrobots.txtしたがって、自動化されたアクセスを制限しているサードパーティのサイトである場合でも、まだうまくいかない可能性があります。)

7
hippietrail

同様の問題がありました。 Symbaが引用したプロキシスクリプトを試してみましたが、何らかの理由で自分のマシンでは機能しませんでした。私の場合、同じホスト上のJBoss ASでホストされているアプリにリクエストを送信しようとしました。どういうわけか、私が持っていたJBossのバージョンには、「Access-Control-Allow-Origin」、「*」を含めることができるように応答ヘッダーを変更する方法がありませんでした。

上記のSymbaのアプローチを使用して解決しましたが、Ben Almanのスクリプトの代わりに、Apacheサーバーにリバースプロキシを設定しただけです https://www.simplified.guide/Apache/configure-reverse-proxy を参照してください。 =。デフォルトでは、Apacheには依然としてクロスドメインの問題があります。応答ヘッダー「Access-Control-Allow-Origin」、「*」を設定することにより、 http://enable-cors.org/server_Apache.html を参照してください。問題は解消されます。

2
George Sibiya

あなたはjsonpリクエストを試すことができます http://api.jquery.com/jQuery.ajax/ クロスドメインを参照してください

1
jimy

クロスドメインjquery ajaxリクエスト をご覧ください。リモートサーバーがJSONPをサポートしている場合は、コールバックを使用できると思います。

1
Santosh Linkha

実際には、GETのみを呼び出すことができます。
クロスサイトスクリプティングを介してPOST、PUT、DELETE、またはPATCHを呼び出すための確実な方法はありません。
実行可能な唯一の方法は、手書きのプロキシです。

1
Sergey Mirvoda

同じOriginポリシーのため、これは実行できません。回避策の1つは、Flashムービーを使用して同じオリジンポリシーをバイパスするFlash AJAX jQuery plugin http://flxhr.flensed.com/ を使用することです。

他のオプションは、独自のドメインを介してリクエストをプロキシするか、JSONPを使用することです。

1
Mark Keats

リソース/データをロードするサーバーにアクセスできる場合は、サーバーの応答のリクエストヘッダーを変更して、

"Access-Control-Allow-Origin"、 "*"

ブラウザーによって適用される同一生成元ポリシー(ブラウザーによって厳格度が異なることがわかっている限り)は、(部分的に?)応答ヘッダーの値に基づいています。

Webサービスからjsonを読み込もうとしたときにも同じ問題が発生しました。私が見つけたすべてのJSハッキングは実際には機能しませんでした。自分が制御している(そして信頼している)サーバーからデータをロードしたいのであれば、なぜこれをしなければならないのか疑問に思いました。次に、サーバーの応答ヘッダーがこの問題全体で重要な役割を果たすことを学びました。上記のヘッダーをWebサービスのhttp応答に追加すると、問題は解決しました。

1
bennidi