既に流通してる名称だからしょうがないけど、JSONPって名前は何だか紛らわしい。この名称はちょっといただけない。
JSONPを試してみよう!というとき、大体こういう感じにhtmlを書く。(なんかscriptタグとか消されるので変なhtmlでご勘弁を)
JSONP test <すくりぷと type="text/javascript"> function f(json) { var foo = json.foo; alert(foo); } var s = document.createElement("script"); s.src = "http://localhost:8080/script/jsonp?callback=f"; document.body.appendChild(s); すくりぷと>
で、サーバ側のcgiか何かがcallback=fってクエリパラメータを受け取って
f( { foo: "bar" } );
こういうレスポンスを返すと、script要素の読み込みによって結果的にサーバからのレスポンスがJavaScriptのコードとして実行され、関数fが指定した引数で起動されるよーん、っていうだけの話。それがJSONP。
でまあ、これってサーバ側からのレスポンスをJSとして実行しているだけなので、本質的にJSONを使うことに必然性はなくって、単にサーバ側が以下のような静的ファイルをホストしているだけでもさっきのは動くことは動く。
var obj = {}; obj.foo = "bar"; f(obj);
見ての通り、JSONとか関係ないのである。
ただ、クライアントのJS - サーバプログラム間で、「サーバ側はクエリパラメータでJSの関数名を受け取って、リクエストとしてJSのオブジェクト表現を関数の引数にぶっこんだテキスト形式で返しましょう」という取り決めをしておくと楽だと。ただそれだけのこと。
分かる人には分かるけど、分からない人にとってはJSONとの関係性が分かりにくい。そもそも本質的にはJSONじゃなくてもいいから余計分かりにくい。
JSONとJSONPの違いをうんぬん、っていう感じに説明すると余計わかりにくい。JSONPとJSONはそもそも何の関係もねーよ、って所から始めるのがスジだと思う。