PHPでXML-RPCを使った記録です。
PEAR::XML_RPC2を使うことにしました。PHP5専用で使いやすそうです。
- PHP5以上
- cURLのエクステンション
が必須です。
クライアント側では、
//クライアント側のコード
require_once './XML/RPC2/Client.php';
$options = array('debug' => true);
$client = XML_RPC2_Client::create('//www.bpsinc.jp/xmlrpc.php', $options); //URLはダミー
try {
$result = $client->Version(); //関数名はサーバ側で定義したもの
print_r($result);
} catch (XML_RPC2_FaultException $e) {
var_dump($e);
} catch (Exception $e) {
var_dump($e);
}
のように使えます。
しかし、これだとなぜか結果が全部NULLになることがあります。
debugメッセージを見ると、Server Responseは正常なのに、Decoded ResultがNULLになっているように見えます。
解決
この問題、Server側かHttpRequestの実装の問題だと思うのですが、Server ResponseのBodyの最初に改行が入っているのが原因でした。
\n<?xml version="1.0"?><methodResponse> …
PEAR/XML/RPC2/Backend/Xmlrpcext/Client.php の112行目付近で、
$result = xmlrpc_decode($body, $this->encoding);
となっているところを、
$result = xmlrpc_decode(trim($body), $this->encoding);
とすれば直ります。(マルチバイト対応のtrimを書いた方が良いかもしれません)
※XMLRPCEXT拡張モジュールが入っていない場合は、PEAR/XML/RPC2/Backend/PHP/Client.phpになります。
ライブラリを書き換えるのは強引ですが、xmlrpc_decode
関数自体がEXPERIMENTALのままですし、あとはHttpRequestやサーバ側を変更しなければ行けないので、スマートな解決方法は思いつきません。
とりあえずresultがnullになる問題は回避できました。