Shikata Ga Nai

Private? There is no such things.

JSON-RPCについてまとめてみた

Hello there, ('ω')ノ

JSON-RPCは、シンプルなJSON形式を使ってクライアントとサーバー間でデータをやり取りする仕組みで、特に高パフォーマンスが求められる場面で有効です。


JSON-RPCの特徴

非同期通信

JSON-RPCの大きな特徴は、クライアントがサーバーにリクエストを送った後、サーバの応答を待たずに次の操作を進められる点です。 また、複数のリクエストを送った場合でも、サーバの応答は順不同で返されます(非同期通信)。

シンプルな構造

RESTと比べて、JSON-RPCは非常にシンプルなプロトコルです。 HTTPメソッド(GET、POSTなど)は使用せず、リクエストとレスポンスを単純なJSON構造で表現します。


JSON-RPC 2.0のリクエストとレスポンスの構造

JSON-RPCには厳密な構文規則があります。 これを守ることで、正しく通信が行われます。

リクエストの構造

リクエストは以下の要素を含みます。

  • jsonrpc: 使用しているバージョン(例: "2.0")。
  • method: 呼び出すリモートメソッドの名前(文字列)。
  • params: 呼び出しに渡すパラメータ(配列またはオブジェクト、任意)。
  • id: リクエストの識別子(文字列、数値、またはnull、任意)。

レスポンスの構造

レスポンスは以下の要素を含みます。

  • jsonrpc: リクエストと同様にバージョン情報を含む。
  • result: メソッドが成功した場合に含まれる結果データ。
  • error: メソッドが失敗した場合に含まれるエラー情報(オブジェクト)。
  • id: リクエストのidと同じ値を返す。

エラーオブジェクトの構造

エラーオブジェクトは以下のような構造を持ちます。

  • code: エラーコード(数値)。
  • message: エラーメッセージ(文字列)。

JSON-RPCとRESTの違い

特徴 JSON-RPC REST
通信方法 JSON構造のリクエストとレスポンス HTTPメソッド(GET, POST, PUT, DELETEなど)
データ形式 JSONのみ JSONまたはXML
エラーハンドリング エラーオブジェクト HTTPステータスコード(例: 404, 500など)
キャッシュ対応 サポートなし キャッシュ可能
シンプルさ 非常にシンプル より複雑

JSON-RPCのリクエストとレスポンス例

以下は、IsStudentというメソッドを呼び出すリクエストとレスポンスの例です。 このメソッドは、与えられた学生IDが登録されているかどうかを確認し、結果を返します。

成功するリクエストとレスポンス

// リクエスト
{"jsonrpc": "2.0", "method": "IsStudent", "params": [100], "id": 1}

// レスポンス
{"jsonrpc": "2.0", "result": true, "id": 1}

エラーが発生するリクエストとレスポンス

// リクエスト
{"jsonrpc": "2.0", "method": "IsStudent", "params": ["ABC"], "id": 2}

// レスポンス
{"jsonrpc": "2.0", "error": {"code": -1, "message": "Invalid enrollment id format"}, "id": 2}

ポイント

  • 成功時にはresultが返され、失敗時にはerrorオブジェクトが返されます。
  • エラーメッセージには、具体的な問題(例: "Invalid enrollment id format")が記載されます。

JSON-RPCを選ぶ理由

  • パフォーマンス重視: 非同期通信により効率的なやり取りが可能。
  • シンプルさ: 最小限のルールで動作するため、軽量で扱いやすい。
  • JSON形式: 直感的で広く使われているデータ形式を採用。

ただし、キャッシュが必要な場合や複雑なステータスコードの扱いが求められる場合には、RESTの方が適していることもあります。


まとめ

JSON-RPCは、シンプルで効率的なプロトコルとして、特に高パフォーマンスが必要な場面で有効です。 非同期通信やJSON形式のサポートにより、開発者にとって使いやすい選択肢の一つとなっています。

Best regards, (^^ゞ