GANCHIKU.com

XML_RPC2の使いかた間違えてた。。orz

2006年10月21日
PHP

非常に痛い間違い。つーか、なんで今まで気づかなかったんだろう。。。
Services_YouTubeでは、ドライバの選択として、xmlrpcも使用できて、その際にXML_RPC2を使っているのだが、全然機能していなかったです。すいません。Services_YouTube-0.2.1をリリースしますので、もしかして、ドライバにxmlrpcを使用する際は、0.2.1以降を使用してください。でも、結局REST使っても、xmlrpc使っても結果が同じなんだから、両方いらないような感じもするが。。。

これに気がついたのは、バグレポートで「エラーハンドリング追加したみたいだけど、xmlrpcでfatal errorが起きるよ。」ってのをいただいたからだった。で、早速調査すると全然ダメじゃん。もう、恥ずかしすぎる。。。

何がいけなかったかというと、XML_RPC2では、
$client = XML_RPC2_Client::create($url, $options);
とするんだけど、prefixがある際には、この$optionsの連想配列にarray(‘prefix’ => “hogehoge.”);って入れないといけないのね。Services_YouTubeだったら、”youtube.users.”とか”youtube.videos.”とか。最後のピリオドは忘れがちなので注意!で、そのままprefix後のメソッド名を渡したいパラメータを引数にして、コールするんだよね。やられたなー。まぁ、今回実装したのは、こんな感じ。

$parameters = array('dev_id' => 'hogehoge', 'user' => 'hogeohge');
$options = array('prefix' => 'youtube.users.');
try {
$client = XML_RPC2_Client::create('http://' . self::URL . self::XMLRPC_PATH, $options);
$result = $client->$method($parameters);
} catch ....

というわけで、Services_YouTubeのAPIは変わらないけど、内部の処理をかなり変更を加えました。あと、error_handlerのところも修正。問題があったのは、simplexml_load_stringのところだったので、parseResponseメソッドに移動しました。

なんでかっつーと、XML_RPC2で、Backendを呼んでいるところで、dl関数を使用しているのはいいんだけど、そこで、phpxmlrpc、もしくはxmlrpcがないと、E_WARNINGを吐いてしまうのだ。@dlなので、エラーを制御していると思いきや、なんてことはないE_WARNINGを拾っちゃうの。なので、XML_RPC2の処理の後で、parseする際にerror_handlerをセットすることにした。

あと、XML_RPC周りのユニットテスト追加。今日のバグはかなり情けなかったので、一気にやっちゃった。まぁ、きっとまだまだバグがあるんだろうなー。でも、少しずつ成長している自分がイイね!

あー。またTesting_Seleniumの方にバグレポートがぁ。。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Shin Ohno 2003-2012