XMLRPCとわたし

  • 投稿日:
  • by
  • カテゴリ:

先日、自分で作った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の形で送っちゃダメってのがあったりすると、それは、サーバが悪い。ってことだよな。

で、本家のspec(の和訳)を見てみたわけですが、

<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を送ってくる方が悪い。という感じがします。します。が、そうも言ってられないような気もします。どうしたもんかねぇ……。