回答:
これはかなり広範な質問であり、wiki自体を正当化する可能性があります。グーグルにはこの2つに関してかなりの部分もありますが、いくつかの重要な点にぶつかると思います。
これらのどちらも問題ではない場合、私はあなたにとって最も簡単で、なじみのあるものを使います。それが問題である場合は、CORSを試してください。CORSはより「モダンな」ソリューションであり、JSONPはハックのようなものであり、データをスクリプトに変換して、クロスドメインの制限をバイパスします。ただし、CORSは通常、より多くのサーバー側の構成を必要とします。
jQueryを使用している場合、CORSが「クライアントにとってはるかに使いやすく、実装が容易である」という考えをどこで思いついているかわかりません。https://gist.github.com/3131951を参照してください。jQueryはJsonPの詳細を抽象化します。CORSは実際には、使用しているテクノロジーによっては、サーバー側で実装するのが多少難しい場合があります。
私は最近、jqueryとbackbone.jsを使用してWebアプリを開発しました。これは、私たちが制御するさまざまなクロスドメインWebサービスから読み取り、IE7をサポートする必要があるため、CORSではなくJson-Pを使用することになりました。サーバー側(Django w / DjangoRestFrameworkを実行)、およびクライアント側のjqueryと実質的に同じです。
あなたはかなり満足しています。レガシーブラウザ(6年以上前にリリースされたもの)をサポートする必要がない場合は、必ずCORSを使用します。
CORSは実装が簡単です。APIがJSONPまたはCORSをまだサポートしていない場合は、応答の本文を変更するよりも、いくつかの静的ヘッダーを追加する方が簡単です。
また、CORSを使用してリクエストをキャッシュする方が簡単です。各JSONPリクエストは、memcachedコンテンツでも動的である必要があります。
JSONPは依然としてスクリプトタグであるため、それが何らかのレベルの同期動作を引き起こすかどうかは関係ありません。CORSはしません。
JSONPはGETのみにすることができます。CORSと同様に、任意の方法を使用できます。
最後に重要なことですが、jQuery v1.xを使用している場合、error
およびcomplete
(またはそれ以上のfail
and always
)ハンドラーは、いくつかの一般的な状況(ネットワークエラーなど)ではJSONPリクエストに対してまだ呼び出されないことを考慮してください。確かに回避策はありますが(タイムアウト設定、jQuery-JSONPプラグイン)、クロスドメインリクエストがモバイルデバイス(ハイブリッドアプリなど)からのみ送信される場合は特にCORSの煩わしさが感じられないので、不幸なブラウザーのサポートは必要ありません。