先日、自分で作ったMovavleTypeメール更新プログラムで、「パスワード設定のミス」という状況に対しておきる現象が、よくわからなくて、非常にはまったことがあった。そのときは、うちの奥さんの機転で、それがパスワードの設定ミスであることがわかったので、まぁ、いいや。という感じで、すませていたわけです。
ところが、自分も同じ内容ではまってしまい、そのエラーに気がつかず、ひどく困った。せめて、「ログインできませんでした」とか、そういうエラーが表示されないとおかしいんじゃないのか?とか、思って、いろいろ調査。
(以下は見やすいように改行処理済み)
% perl XMLRPCsh.pl http://hostname/path/mt-xmlrpc.cgi > on_debug(sub{ use Jcode; print jcode("@_",'utf8')->jis;}) --- METHOD RESULT --- XMLRPC::Lite=HASH(0x8069a20) > metaWeblog.getRecentPosts('1','validusername','invalidpassword') POST http://www.gabi-n.net/mt/mt-xmlrpc.cgi HTTP/1.1 Accept: text/xml Accept: multipart/* Content-Length: 226 Content-Type: text/xml <?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>metaWeblog.getRecentPosts</methodName> <params> <param><value><int>1</int></value></param> <param><value><string>konishi</string></value></param> </params> </methodCall> HTTP/1.1 200 OK Connection: close Date: Fri, 21 Jul 2006 10:50:04 GMT Server: Apache/1.3.34 (Unix) PHP/5.1.4 Content-Length: 327 Content-Type: text/xml Client-Date: Fri, 21 Jul 2006 10:50:05 GMT Client-Peer: 210.138.60.146:80 Client-Response-Num: 1 SOAPServer: SOAP::Lite/Perl/0.52 <?xml version="1.0" encoding="UTF-8"?> <methodResponse> <fault> <value> <struct> <member> <name>faultString</name> <value> <array> <data> <value> <string>ログインできません</string> </value> </data> </array> </value> </member> <member> <name>faultCode</name> <value> <int>1</int> </value> </member> </struct> </value> </fault> </methodResponse> --- XMLRPC FAULT --- 1 ARRAY(0x85e4c9c)←ここに「ログインできません」と表示されるのが正しい動き >
結論から言うと、XMLRPC::Liteのクライアントのエラー処理部が、faultStringをARRAYの形で複数行のstringとして送られてくるResponseを正しく認識できてない。ということなのだろうと、思う。ただ、そもそも、XMLRPCのレスポンスとしてARRAYの形で送っちゃダメってのがあったりすると、それは、サーバが悪い。ってことだよな。
<methodResponse> には単一の <fault> を含ませることも可能です。<fault> は単一の <value> を含み、その <value> は単一の <struct> を含み、<struct> は2つの要素 <faultCode> と <faultString> を含みます。<faultCode> の型は <int> で、<faultString> の型は <string> です。
って、書いてあったり、
・<fault> 要素の struct に <faultCode> と <faultString> 以外の member を追加しても良いのでしょうか? グローバルな(Java や Python などの例外にマッピング可能な) faultCode の一覧はあるのでしょうか?
<fault> 要素 の struct には、この仕様書でされていない member を 含めてはいけません。これは他のデータ構造に関しても同様です。仕様は充分フレキシブルで、一般的なデータ転送は定義された構造に従って処理可能なはずです。もしどうしても、そうではないという点があれば、掲示板の方へその内容を投稿してください。
グローバルな faultCode の一覧はありません。エラーはサーバアプリケーションに依存、もしくはこのプロトコルより上位にエラーを定義している標準規格があるためです。
って書いてあるわけです。つまり、ARRAYになってるResposeを送ってくる方が悪い。という感じがします。します。が、そうも言ってられないような気もします。どうしたもんかねぇ……。