JSONPとは何者か【JSONとの違い・jQuery.ajaxでの利用】
jQueryゴリゴリな環境でJSONPを用いた非同期通信に触れる機会があったが、そもそもJSONPが何者かすら理解してなかったので調べる。
JSONとJSONPの違い
名前からしてJSONを拡張したものかと思っていたが、JSONPはあくまでスクリプト (JavaScript)。
厳密には「返り値であるJSONを引数とした、リクエスト時に指定したコールバックを実行するスクリプト」。
なぜJSONPを利用するのか
他オリジンからデータを取得するため。
もしXMLHttpRequestやFetch APIを利用してクロスドメインに非同期通信を行おうとするとCORSの制約を受けてしまう。
しかし上記のように<script>
のsrc
に指定した場合はその制約を受けないので、
- クライアント側でリクエスト前にコールバック関数を定義しておき、その関数名をクエリパラメータに付与しリクエストする
- サーバ側はレスポンスとして「返り値のJSONを引数にした1の関数」を実行するスクリプトを返す
- クライアント側は2のスクリプトを実行する
ことによりデータの取得 (+処理の実行) が可能になり、この仕組みがJSONPと呼ばれる。
jQuery.ajaxを利用する場合
余談だが筆者の場合、前述の仕組みを大して知らなくても簡単にJSONPを用いた非同期通信が実装できた。
というのもjQuery.ajax()
はJSONP形式に対応しており、上記のように書くだけで下記の一連の処理をjQueryがよしなにやってくれる。
- コールバック関数名を指定したクエリパラメータ
callback=jQueryxxx_yyy
をリクエスト先URLに追加 - 1のURLに向けた
<script>
を生成しDOMツリーへ追加 (3の実行後に削除される) - レスポンス内のJSON部分が
Object
にパースされ、success()
に渡される
参考