3

私はクライアントがServerAにバックエンドコードを持っているプロジェクトに取り組んでおり、AJAXリクエストを介してバックエンドと通信することになっているフロントエンドコードはServerBにあり、それらは異なるドメインにあります。同一生成元ポリシーのため、これらのリクエストを正常に行うことができません(POSTでもGETでもありません)。JSONPを処理するためにバックエンドコードを変更せずに、なんとかしてそれを有効にすることは可能ですか?たとえば、その特定のドメインのホワイトリスト、または何か?

バックエンドコードが10.0.1.4(別のマシン)で実行されているローカルネットワークでこれをエミュレートしようとしましたが、ローカルホスト(apache)からアクセスしていますが、必要のないものを見つけることができませんでしたjsonpを使用します。呼び出しが行われると、バックエンドのログに何も表示されませんが、RESTクライアントから、GETリクエストのURLをロードするだけで正常に機能します。JSONPを使用しないパブリックAPIリクエストはどのように実装されますか?

動作するには、少なくとも1つのメソッド(POSTまたはGET)が必要です。ありがとう。

4

3 に答える 3

4

JSONPを処理するためにバックエンドコードを変更せずに、なんとかしてそれを有効にすることは可能ですか?たとえば、その特定のドメインのホワイトリスト、または何か?

はい、ドメインにサーバー側スクリプトを記述して、ドメインとリモートドメイン間のブリッジとして機能させ、AJAXリクエストをスクリプトに送信することができます。

奇跡を期待しないでください。リモートドメインを制御できない場合は、破壊されます。セキュリティ上の理由からブラウザに組み込まれているのと同じオリジンポリシーの制限により、問題が発生します。そうですね、このポリシーを実装していない独自のブラウザをいつでも作成できますが、私の主張は理解できると思います。

一般的な回避策にはJSONPCORSが含まれますが、これらにはリモートドメインの制御が含まれます。あなたがコントロールを持っていないなら、私の前の文と私の最初の文を読んでください。

これは、jQueryを使用してクロスドメインAJAXを実現するためのいくつかの一般的な手法をカバーする優れたガイドです。次に、シナリオに最適なものを適応させます。そして、他の回避策のどれもあなたを助けない場合、100%の場合に防弾で機能するサーバーサイドスクリプトで2つのドメインを橋渡しすることを含む重い砲兵の解決策が常にあります。

于 2012-07-09T22:16:53.463 に答える
1

JSONPを処理するためにバックエンドコードを変更せずに、なんとかしてそれを有効にすることは可能ですか?たとえば、その特定のドメインのホワイトリスト、または何か?

うーん、ほとんどありません。CORSを介してJSONPまたは「ホワイトリスト」を許可する必要があります(これは非常に簡単です)。または、YQLをクロスドメインプロキシとして使用できます。

于 2012-07-09T22:19:10.090 に答える
0

ここに投稿された3つのソリューション:

http://devlog.info/2010/03/10/cross-domain-ajax/

私は 3 番目のオプションを試しましたが、それは私にとってはうまくいったので..通常の ajax 呼び出しと同じように処理するだけだったので、余分なストレスを感じる必要はありませんでした。

これは2年前に投稿されたので、回答を更新します:

上記のリンクが機能しなくなりました。

サーバー側プロキシ:

古いページでは、サーバー側プロキシの使用についても説明しています。これは、サーバーが別のサーバーに呼び出しを行い、すべてのデータを取得して、そのサーバーにあるページに送信することを意味します。あるサーバーが別のサーバーからデータを取得することは問題ありません。したがって、ページはそのサーバーに対して通常の ajax 呼び出しを行うことができます。より多くの手作業が必要になるため、このオプションは使用しませんでした。したがって、ここで説明するオプションを使用することをお勧めします。

jQuery を使用した JSONP

  1. プロバイダーが JSONP をサポートしていることを確認してください。
  2. dataType オプションを jsonp に設定し、プロバイダーが「callback」以外の別の GET パラメーターを使用する場合は、そのパラメーター名に jsonp オプションを指定します。

$.ajax({ // ... Use the AJAX utility as you normally would dataType: 'jsonp', // ... });

jQuery は、この要求に対して一意のコールバック名 (json1268267816 など) を生成します。したがって、Web サービスからの応答は次のようになります。

json1268267816({'uid': 23, 'username': 'Chroder', 'name': 'Christopher Nadeau'});

しかし、jQuery はそれをすべてシームレスに処理するため、開発者は、同じ jQuery の成功/失敗/完全なコールバック フックを使用して、通常の AJAX 要求のように処理するだけです。

欠点:

このメソッドの最初の制限は、プロバイダーに依存して JSONP を実装する必要があることです。プロバイダーは、JSONP を実際にサポートする必要があります。JSON データをそのコールバック関数名でラップする必要があります。

次の制限 (これは大きな制限です) は、JSONP が POST 要求をサポートしていないことです。すべてのデータがクエリ文字列で GET データとして渡されるため、サービスで長いデータを渡す必要がある場合 (たとえば、フォーラムの投稿、コメント、記事など) は非常に制限されます。しかし、プッシュするよりも多くのデータをフェッチする大多数のコンシューマー サービスにとって、これはそれほど大きな問題ではありません。

でも、

JSONP をサポートする jQuery のようなライブラリを使用すると、これらの特別なスクリプト タグの挿入と特別なコールバック関数の作成の詳細はすべて自動的に処理されます。JS ライブラリを使用する場合、通常、JSONP と実際の AJAX の唯一の違いは、「jsonp」オプションを有効にすることです。

于 2012-07-09T22:31:14.287 に答える