NOV
24

WP-XML-RPCLib & WP-XML-RPCCLib

Published:2008-11-24 00:51:33 UTC

What’s this?

This project is terminated.  WP-XML-RPCLib2 is the successor project.

Comments :10

中山 卓司 08-11-26 14:50:40 UTC

 すごいLibraryを公開して下さって、ありがとうございます。

 C#初心者のくせにBlogエディタの作成を考えていました。

 エンドポイントに対してクライアントからCallMethodを実行して受け取ったResponseからXMLを取り出すのは、どうすればよろしいのでしょうか?

 よろしくお願いします。

shiroica 08-11-26 21:46:54 UTC

コメントありがとうございます。自分もC#初心者ですので、使われる際に何か気付かれたことがございましたら是非お教え下さい。
さて、XmlRpcClientクラスのCallMethodメソッドですが、サーバから返されたXMLを戻り値からXmlNodeクラスやXmlDocumentクラスの形で取得することは現状出来ません。その代わり、CallMethodメソッドから返されるXmlRpcMethodResponseクラスのインスタンスに、サーバから返されたXMLをパースして得られた情報を保存してあります。XMLRPCフォールトが返された時はFaultCodeプロパティやFaultStringプロパティにその詳細を、フォールトでなければResponseプロパティにXmlRpcValueクラスのサブクラスのインスタンスによるツリー(という表現でいいのかな?)を入れることで返却されたXMLを表現しています。これらは、CallMethodメソッドの実行後、一旦ブレークポイントで実行を止め、返却されるXmlRpcMethodResponseクラスのインスタンスをローカル変数ウィンドウで見て頂くことで構造はわかるかと思います。
そうではなくて、XPath等で一気に値を取得したいなどの理由でサーバーから返却されたXMLを格納したXmlDocumentを必要としているのならば、XmlDocumentを返すCallMethodメソッドのオーバーロードを用意しますが・・・。

中山 卓司 08-11-27 03:53:58 UTC

 返信ありがとうございます。

 CallMethod実行後にブレイクポイントで止めて中を見てみました。

 例えば、FC2(http://blog.fc2.com/xmlrpc.php)にblogger.getUsersBlogsを実行しますと、blogID,url,blog名が返ってきます。

 XmlRpcMethodResponseクラスのソースも見てみたのですが、今の私には、インスタンスが保持するその値へのアクセス方法がわからないのです。

 XmlRpcMethodResponseクラスが公開しているのは、FaultCode, FaultOccured,Responseだけですし、Responseが
XmlRpcValueクラスのArrayListだとは分かるのですが、そこまでです。

 コメント欄を変な質問で汚して申し訳ありません。

 うまくいけば、Libraryの使い方サンプルみたいなものを公開しようと思っていましたが、挫折しそうです。

中山 卓司 08-11-27 09:12:55 UTC

_hostName=”http://blog.fc2.com/xmlrpc.php “;
_userAgent=”test”;
USERNAME:FC2のID
PASSWARD:FC2のパスワード

で、下記コードで取得出来ました。

コメント欄を汚して、申し訳ありませんでした。
削除して頂いてかまいません。

素人考えで申し訳ないのですが、
 XmlSerializeで読み込んで、LINQ to XMLで操作すると
.NET3.5らしいのではないでしょうか?

ありがとうございます。
private void getBlogInfo_test() {

XmlRpcClient client = new XmlRpcClient(_hostName, _userAgent);
XmlRpcMethodResponse response = client.CallMethod(“blogger.getUsersBlogs”, false, new XmlRpcValue[]{
new XmlRpcString(“dammy”),
new XmlRpcString(USERNAME),
new XmlRpcString(PASSWORD)
});

if (response.FaultOccurred==false)
{
XmlSerializer x = new XmlSerializer(typeof(XmlRpcValue));
MemoryStream memoryStream = new MemoryStream();
XmlRpcArray ars = (XmlRpcArray)response.Response;
XmlRpcValue[] arp = ars.Values;

for(int i=0; i < arp.Count() ;i++)
{
XmlRpcStruct xs = (XmlRpcStruct)arp[i];
XmlRpcStructMemberCollection xsm = xs.Members;
foreach (XmlRpcStructMember xm in xsm)
{
MessageBox.Show(xm.Name.ToString() + ” : ” +((XmlRpcString)xm.Value).Value.ToString());
}
}
}
else
{
MessageBox.Show(response.FaultString);
}
}

shiroica 08-11-27 10:58:04 UTC

解決されたようでなによりです。
>コメント欄を汚して、申し訳ありませんでした。
とんでもないです。中山さんと同様なところでつまづいた方の助けとなるかと思いますので、上のコメントは残しておいてよろしいでしょうか?不都合がありましたらお申し付けください。
>XmlSerializeで読み込んで、LINQ to XMLで操作すると.NET3.5らしいのではないでしょうか?
う~ん、そうかもしれません。自分も初心者でして、実は今回のライブラリ製作はXmlReaderを使う練習でもあったので、あまりそこらへんはよく考えず作りました。
LINQ to XMLは使った経験がないのですが、ライブラリという形式をとる以上、出来るだけ高速で、軽量であってほしいので、http://msdn.microsoft.com/ja-jp/library/bb387048.aspxをみると、結果論ですがXmlReaderを使用したことは良かったのかなと考えています。
ただ、サーバーから返却されたXMLの処理の仕方は、人それぞれ状況に応じて好みがあるでしょうから、次のリリースでは戻り値がStreamであるCallMethodメソッドのオーバーロードも用意しようと思います。

中山 卓司 08-11-28 16:55:56 UTC

 コメントありがとうございます。

 さて、Libraryを使ってクライアントを作成しようとしているのですが、例外が発生しる場合があります。

 現在、気がついている点は、
  XML-RPCのエンドポイントのURLが違っていた場合に例外が
 発生して止まります。

  幸いソースまで公開して頂いていますので、例外処理を加えようと思っていますが、報告させて頂きます。

 それでは、

shiroica 08-11-29 22:02:37 UTC

返信が遅くなり、申し訳ありません。
>XML-RPCのエンドポイントのURLが違っていた場合に例外が
発生して止まります。
とのことですが、これは仕様です。URLを間違った結果、サーバーがhttp status codeの404などを返した場合は、System.Net.WebExceptionが、http status codeは200台だけれども、返されたコンテンツがXMLRPC応答として不正な場合はSharpLab.XMLRPCLib.XmlRpcInvalidResponseExceptionを返すようになっています。エンドポイントURLが間違っている場合というのは例外を発生させるべきケースで、その例外は、ライブラリではなく、ライブラリを利用するアプリケーションがハンドリングするべきだと考えてそのままthrowしています。御了解ください。

中山 卓司 08-12-06 07:26:30 UTC

 度々申し訳ありません。

 上記エラーについては、FaultOccurred,FaultCode,FaultStringをセットして返すようにしました。

 WP-XML-RPCLIBのGetUsersBlogs()をWordpress 2.6.2に対して行った場合にユーザ名/パスワードが違うとエラーになりました。

 ソースを確認しますと、パラメータがusername,passしかないよですので、一つ目にダミーのパラメーターを入れたところ回避できるようになりました。
 
 もしくは、メソッド名を”wp.getUsersBlogs”に変更することでも回避出来ました。

 Wordpressのバージョンによるのでしょうか?

 以上、報告致します。
 

shiroica 08-12-06 11:50:31 UTC

ご迷惑をおかけしました。WordPressのXMLRPCメソッドはbloggerやMovableTypeのAPIを拡張したものでできているのですが、調べてみたところ、blogger系のメソッドは第一引数にダミーのパラメータを必要とするようでした。この問題はGetUsersBlogsメソッドに限らず、他のメソッドにも影響しているようですので、修正版を後でまとめてアップします。報告、非常に助かりました。ありがとうございました。まずは取り急ぎご連絡まで。

shiroica 08-12-06 23:17:35 UTC

DeletePost、GetUserInfo、GetUsersBlogsの三つのメソッドの修正を行ったものに差し替えました。よろしければご利用ください。

Trackbacks : 3

Trackback URL for this entry
http://blog.sharplab.net/blog/2008/11/24/1383/trackback/

Listed below are links to weblogs that reference this entry

ピンバック from WP-XML-RPCLib閑話 - SharpLab. 08-11-24 00:55:29 UTC

[…] というわけでWP-XML-RPCLibをリリースしました。先日WordPress2.7β3がリリースされたなど、いよいよWP2.7も正式公開が見えてきており、それに合わせて公開した格好です。もともとは何かWP2.7 […]

ピンバック from C# で SQLite を使う - www.be-styles.jp 08-11-24 17:00:43 UTC

[…] でに、ここのメモを好きな時に WP-XML-RPCLib & WP-XML-RPCCLib – SharpLab. <http://blog.sharplab.net/computer/cprograming/wp-xml-rpclib/1383/&gt; でそのままブログにつっこめたら、便利かなぁとか何とか考えて […]

ピンバック from WordPress 2.7の新XML-RPC API - SharpLab. 08-12-16 01:17:14 UTC

[…] 前に公開したWP-XML-RPCLib & WP-XML-RPCCLibというWordPress2.7のAPIを扱うための.NET言語向けライブラリですが、近いうちに修正版を出したいと思っています。今のバージョンに明確なバグがあ […]