PHPで簡単にXML_RPCが使えるpear::XML_RPC2
なんだけど、複数のprefix使うのが上手くいかない
というのも、XML_RPC2はオブジェクトを作るときにprefixを指定するようになってる
$options = array(
'prefix' => 'blogger.',
'encoding' => 'utf-8');
$server = XML_RPC2_Server::create('Blogger', $options);
$server->handleCall();
っと言う感じ
これで、methodNameにblogger.hoge をリクエストすると
Bloggerクラスのhogeメソッドが呼ばれるわけだけど
だけど問題があって、作成時に指定したprefix以外のクラスをリクエストするとエラーになる
例えば上記のロジックに対して
metaWeblog.newPostをリクエストすると
MetaWeblogクラスのnewPostが呼ばれるのではなく、
エラー server error. requested method not foundとなってしまう。
なんか良い方法ないかなと思ってXML_RPC2_Serverのドキュメントみたけど酷すぎるし
日本語サイトをググっても複数のPrefixを使った例は見あたらず
外国語のサイトをぐぐって、やっと複数のprefixを使っている人を見つけたけどprefixごとに別のURLを作ってた
ただ、WindowsLive Writer の場合 prefixに関係なく投稿先は同じURLに送信するからこの方法は使えない。
ということで、自力でどうにかするしかなさげ、
要はリクエストのPrefixを元にしてXML_RPC2_Serverのインスタンスを作れば良いんだから、POSTデータからPrefixを抽出すれば良い
Prefixはリクエストから正規表現
"/<methodName>(.*)\..*<\/methodName>/i"で取得することにした
修正版
//Postからprefixを求める
preg_match("/<methodName>(.*)\..*<\/methodName>/i", $GLOBALS['HTTP_RAW_POST_DATA'], $prefix);
// 求めたprefixを元にオプションを作る
$options = array(
'prefix' => $prefix[1].'.',
'encoding' => 'utf-8');
// previxを元にXML_RPC2_Serverクラスを作って実行
$server = XML_RPC2_Server::create($prefix[1], $options);
$server->handleCall();
注意 この方法だとPrefix次第で好きなクラスにアクセス出来ちゃうから、取得したPrefixがアクセス許可されている物か調べる事