XMLRPC 使用上の注意点システム間結合をする際 XML-RPC という便利な仕様があります。この仕様はよくできていて、仕様が軽量である上に、よほどのことがなければトラブルは起こらないでしょう。以下は少ないトラブルのうち、実際に経験した内容です。 doubleXMLRPC の浮動小数点数型である double では、仕様 Python の xmlrpclib PHP の xmlrpc extension Java での代表的な実装である Apache WS XML-RPC v3.0 Python 2.6, 3.0 >>> repr(0.000000023) '2.3000000000000001e-08' Java 1.6.0_10 class hoge { public static void main(String[] argv){ System.out.println(0.000000023); } } > java hoge 2.3E-8 いずれにせよ XMLRPC のオリジナル仕様のままでは、浮動小数点数の精度落ちは避けられません。精度を確実に保持したいのであれば、base64 型を使って解釈をアプリケーション側で規定するか、XMLRPC 仕様を拡張して浮動小数点数の表現に hex 形式を使うかしなければなりません。 dateTime.iso8601ISO 8601 の仕様は 2 回改定が行われていて、改定のたびに表現形式が増えています。XML-RPC でのシステム間結合時に全てのフォーマットに対応するのは現実的ではありません。秒単位までの精度表現が使われて、いくつかの限定されたフォーマットにのみ対応しているのが実情です。 世の中で日付形式として一般的に採用される傾向にあるのが、2009-01-07T12:45:32+09:00 といったフォーマットです。困ったことに XML-RPC 仕様で例として挙げられている形式はこれとは異なり、19980717T14:08:55 という形式になっていて、多くの実装はこれに倣っています。この形式の問題点は TIMEZONE が与えられないことで、XML-RPC 仕様では、それぞれのサーバがどの TIMEZONE を使うかを明示的に宣言するとされています。うっかり油断していると、システム間での TIMEZONE の違いに起因して正しく時刻を伝えられないかもしれないので、注意が必要です。個人的には TIMEZONE つきで通信してしまうのがいいと思っています。 PHP xmlrpc extension の実装では、5.2.7 以降 TIMEZONE がつくようになりました。ちなみに XMLRPC datetime 型の timestamp メンバー変数は現時点での PHP 5.2.8 でも誤った値になっているので、strtotime を使って scalar メンバー変数から変換して正しい timestamp が得られます( PHP report // output $a=date('c'); xmlrpc_set_type($a,'datetime'); // input $data=xmlrpc_decode($xml); $timestamp=strtotime($data->scalar); Python xmlrpclib system.multiCallXML-RPC の拡張仕様のひとつに system.multiCall というものがあります。仕様自体は本来は xmlrpc.com にあったはず 追い討ちをかけるようですが system.multiCall でリクエストをシリアライズすると、通常シリアルにしか実行されないので、むしろパラレル化を行ったほうがシステム結合において全体のレスポンスタイム短縮化に寄与することが多いです。この拡張仕様を積極的に使う理由は特にないかもしれません。 UTF-8XML-RPC はその名のとおり XML をベースにしているので、本来 XML 仕様にあるとおり Apache WS XML-RPC 2.0 XmlRpc.setDriver("xerces"); この他にも、次のような名前で SAX パーサのクラスを切り替えられるようになっています。
現行の Apache WS XML-RPC 3.0 HTTP Status codeXMLRPC においては HTTP 通信路は、まさに通信路でしかありません。HTTP ステータスコードは常に 200 です。それ以外のステータスコードが返された場合は、XMLRPC としては「通信路が壊れた」状態です。XMLRPC において HTTP ステータスコードについて言及するのは、ちょうど HTTP において TCP について言及するのと同じことです。 |
© 2006-2008 Internet Revolution