ビットコイン・インスティテュート

JSON-RPC APIからのHTTPステータスコード

4件のメッセージ BitcoinTalk ギャビン・アンドレセン, サトシ・ナカモト, nelisky 2010年9月1日 — 2010年9月6日

BitcoinがJSON RPC over HTTPの仕様に準拠し、JSON-RPC 1.1/2.0の仕様で標準化されたエラーコードを使用するようにするパッチをサトシに提出した。

JSON-RPCコールで直接Bitcoinと通信している場合、新しいHTTPステータスコードとJSONレスポンスの’error’メンバーの新しいフォーマットを認識するようにコードを変更する必要があるかもしれない。例えば:

変更前:{“id”:“123”, “method”: “nosuchmethod”, “params”: [] } を送信した場合のレスポンス:

HTTP/1.1 500 Internal Server Error
...

{"result":null,"error":"Method not found.","id":"123"}

変更後:

HTTP/1.1 404 
...

{"result":null,"error":{"code":-32601,"message":"Method not found"},"id":"123"}

コードを簡素化するために、壊れていた’Batch’サポートも削除した。JSON-RPC 2.0のバッチサポートを正しく動作させていたが、JSON-RPC 2.0は今のところBitcoinがサポートするには先進的すぎるため(JSON-RPCのグルーライブラリでまだサポートしているものがなく、仕様もまだ少し変わっている)、それらの変更を取り消した。

この変更について今発言するか、永遠に黙っていてくれ…サトシはこの機能をBitcoinの次のバージョン(0.3.12)に含める予定だ。

JSON-RPC APIを使用している場合は、エラー条件の処理コードを確認すべきだ。繰り返しになるが、変更点はerrorメンバーがStringではなくObject(‘code’と’message’フィールド付き)になり、method-not-foundの場合HTTPステータスコードが500ではなく404になる可能性があるということだ。

これはSVN rev 147に入っている。

これはより標準的であり、json-rpc 1.0ではエラーオブジェクトの形式を指定していなかったが、文字列やその他の値ではなくオブジェクトであることは指定していたため、正しくするためにこの変更が必要だった。code/messageメンバーは後のjson-rpc仕様で標準になっている。

エラーを検査して文字列を期待するコードがある場合は、変更が必要だ。エラーがある場合、エラーメンバーは文字列ではなくオブジェクトになった。

SVN rev 147にはさらに:

  • コマンドラインjson-rpcがエラーコードを終了コードとして返す。unixでは終了コードは0-255のみなので、abs(code)%256だ。
  • 別のスレッドで議論されたbackupwallet <destination> コマンド。ウォレットをロックしてコピーするため、正しいコピーを確実に取得できる。
nelisky 2010年9月6日21:26 UTC
サトシ・ナカモトの投稿(2010年9月6日21:21 UTC)

SVN rev 147に入っている。

こちらの方が標準的だ。JSON-RPC 1.0はエラーオブジェクトの形式を規定していなかったが、文字列や他の値ではなくオブジェクトであるべきだとは規定していた。だから正しい形に直す必要があった。code/messageメンバーは後のJSON-RPC仕様では標準になっている。

エラーを検査して文字列を期待するコードがある場合は、変更が必要だ。エラーがある場合、エラーメンバーは文字列ではなくオブジェクトになった。

SVN rev 147にはさらに:

  • コマンドラインjson-rpcがエラーコードを終了コードとして返す。unixでは終了コードは0-255のみなので、abs(code)%256だ。
  • 別のスレッドで議論されたbackupwallet <destination> コマンド。ウォレットをロックしてコピーするため、正しいコピーを確実に取得できる。

おお、これは両手で大賛成だ。見事だ、サトシ!