JSON-RPC API からの HTTP ステータスコード
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"}変更後:Code: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>コマンド。ウォレットをロックしてコピーするため、正しいコピーを確実に取得できる。
SVN rev 147に入っている。
こちらの方が標準的だ。JSON-RPC 1.0はエラーオブジェクトの形式を規定していなかったが、文字列や他の値ではなくオブジェクトであるべきだとは規定していた。だから正しい形に直す必要があった。code/messageメンバーは後のJSON-RPC仕様では標準になっている。
エラーを検査して文字列を期待するコードがある場合は、変更が必要だ。エラーがある場合、エラーメンバーは文字列ではなくオブジェクトになった。
SVN rev 147には他にも:
- コマンドラインのJSON-RPCはエラーコードを終了コードとして返す。Unixでは終了コードが0〜255に限られるため、abs(code)%256になる。
- 別スレッドで議論した「backupwallet 」コマンド。ウォレットをロックしてコピーするので、正しいコピーが取れることを保証できる。
おお、これは両手で大賛成だ。よくやった、サトシ!