JSONPとJSON RPCについて

実は先日、ちょっとしたご縁で『SMARTHOUSE HACKERS』というイベントに参加させていただきました。

アイデアもプログラミング能力も一般的なHacker(?)の皆様には遥かに劣る自分なので、全然大した成績は残せなかったのですが、なかなかに得るものがあったと思います。

とにかく感心したのが、家電をHackするための敷居の低さ。Kadecotサーバ(KadecotCore)というAndroidアプリサーバに対して、URLを書いて投げるだけでいろんな機器を制御可能。仕組みを知らなくても、基本ほぼコピペでOKなのはすごいです。でもこれぐらい敷居低くないと、いろんな人に参加してもらうハッカソンをやるのは難しいのだろうな、きっと。

さて、そのあたりのWebAPI云々に絡んで、自分の周りではJSONPやらJSON RPCやらを耳にすることが多くなりました。未だにちゃんと理解していないので、それぞれいったいどんなものなのかを、簡単にメモしておくことにします。いつものごとく、間違ったことを書いている可能性は大いにあるので、その辺はご了承ください。

<JSONP>

ずっと「JavaScriptのクロスドメイン制約を突破する仕組みらしい」ということしか知らなかったので、いい加減どういう仕組みでどういう特徴があるのかを調べなきゃマズいな、ということで、主に以下を参照させていただきました。

あと、Wikipediaと、書籍『JavaScript徹底攻略』。自分的な理解のポイントは以下。

  • 書き方の基本は、<script type=’text/javascript’ src=’http://somedomain.com/getjson?callback=mycallback’> こんな感じ。URLの後ろに、パラメータとしてコールバック関数名をくっつけるのがポイント。必要があればさらに後ろに&でパラメータを続ける。
  • HTMLのscriptタグのsrc属性には、別ドメインのURLを指定して通信することができる(=クロスドメイン制約を受けない)という点を利用している
  • JSONP = JSON with Padding。このPadding(付加)は何を付加するのかというと、クライアント側で実行されるコールバック関数の名前を、本来レスポンスとして返すJSON文字列に付加している(先にクライアントからURLのパラメータとして送られてきたもの)。つまり、サーバは通常のJSON文字列をレスポンスとして返すのではなく、”コールバック関数名(JSON文字列)”の形でレスポンスを返している。これがJSONPの名前の由来。
  • クライアント側は、サーバからのレスポンスを受けて、コールバック関数を即実行する。つまり、パラメータとして渡した名前の関数を、クライアント側で事前に定義しておく必要がある。サーバ側は、クライアント側で定義されているコールバック関数が必要とするパラメータを、JSON文字列として返してやる必要がある。
  • つまり、JSONPは、クライアント側とサーバ側、両方セットで実装しないといけない。

<JSON RPC>

JSON RPC (Remote Procedure Call)については、以下を参照した程度。

ポイントは以下。

  • 書き方の基本は、クライアントが {“jsonrpc”: “2.0”, “method”: “subtract”, “params”: [42, 23], “id”: 1} を送り、サーバが{“jsonrpc”: “2.0”, “result”: 19, “id”: 1} を返す、こんな感じ。
  • メソッドの指定もパラメータの指定も、すべてJSON文字列。文字列のやりとりになるので、WebSocketでも扱いやすい。
  • バッチリクエストが可能。これは一度のリクエストで複数の関数呼び出しを行うもので、クライアント側でリクエスト回数を減らすことができる。

バッチ処理のとき、リクエストが実行される順番はどうなるのだろう?サーバ側の実装次第なのかしら。