XML_RPC2で複数のprefixを使う方法

2009/2/15 9595hit

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がアクセス許可されている物か調べる事

前:XML-RPC2にはまる 次:はてなブックマークのアイコンを追加したよ

関連キーワード

[PHP][IT]

コメントを投稿する

名前URI
コメント