XML-RPC in C# (转)
对Wordpress进行操作,除了通过他的Web后台外,还有一种方法就是通过XML-RPC来实现。
关于XML-RPC我就不再赘述了,简单的来说就是:将包含着操作命令和操作数据的XML通过Http传输给XML-RPC Server。然后Server根据此XML分析出来的命令和数据进行操作,然后返回用户一个XML,里面包含了用户所需要数据的XML。
拿Wordpress自身的wp.getUsersBlogs命令举例
wp.getUsersBlogs
Retrieve the blogs of the users.
Parameters
- string username
- string password
Return Values
- array
- struct
- boolean is_admin
- string url
- int blog_id
- string blog_name
- string xmlrpc_url
以上is_admin是表示该用户是否为管理员,url当然是你的博客地址,blog_id指的是博客的id到后面有用,blog_name指的是博客名(比方说我的是“风云阁”),xmlrpc_url是XML-RPC Server的地址。
值得一提的是,针对Wordpress而言,如果你的博客地址是http://www.xxx.com,则他的XML-RPC Server地址是http://wwwxxx.com/xmlrpc.php。
它的输入XML是
<methodCall> <methodName>wp.getUsersBlogs</methodName> <params> <param> <value> Username </value> </param> <param> <value> Password </value> </param> </params> </methodCall>
以上的Username当然就是用户名了,Password当然就是你的密码,wp.getUsersBlogs是获得Blog的操作名。
当正确的时候返回的XML是(以我为例)
<methodResponse> <params> <param> <value> <array> <data> <value> <struct> <member> <name>isAdmin</name> <value> <boolean>1</boolean> </value> </member> <member> <name>url</name> <value> <string>http://www.iron-feet.cn/</string> </value> </member> <member> <name>blogid</name> <value> <string>1</string> </value> </member> <member> <name>blogName</name> <value> <string>风云阁</string> </value> </member> <member> <name>xmlrpc</name> <value> <string>http://www.iron-feet.cn/xmlrpc.php</string> </value> </member> </struct> </value> </data> </array> </value> </param> </params> </methodResponse>
当用户名和密码出错的时候的XML是
<methodResponse> <fault> <value> <struct> <member> <name>faultCode</name> <value> <int>403</int> </value> </member> <member> <name>faultString</name> <value> <string>Bad login/pass combination.</string> </value> </member> </struct> </value> </fault> </methodResponse>
根据Wordpress官方网站,Wordpress还支持Blogger API、MetaWeblog API以及Movable Type API
WordPress uses an XML-RPC interface. We currently support the
Blogger API,metaWeblog API, and the Movable Type API.
各位看官们可以通过相关文档以及我上面的结构,获得正确的XML
自从有了Linq,很多东西变得非常方便了,比方说构造XML。接下来,介绍一下如果利用C#语言通过Linq构造XML,
比方说刚刚那个wp.getUsersBlogs的XML,构造代码如下:
XElement XmethodCall= new XElement("methodCall", new XElement("methodName", "wp.getUsersBlogs"), new XElement("params", new XElement("param", new XElement("value", new XElement("string", _strUsr) ) ), new XElement("param", new XElement("value", new XElement("string", _strPwd) ) ) ) );
如何通过C#发送Post,方法如下:
XElement Post(XElement XmethodCall) { WebRequest req = WebRequest.Create(strXmlRpc);//strXmlRpc是XML-RPC Server的地址,例如:我的就是http://www.iron-feet.cn/xmlrpc.php req.ContentType = "application/x-www-form-urlencoded"; req.Method = "POST"; byte[] bytes = System.Text.Encoding.ASCII.GetBytes(XmethodCall.ToString()); req.ContentLength = bytes.Length; System.IO.Stream os = req.GetRequestStream(); os.Write(bytes, 0, bytes.Length); os.Close(); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); XElement tempX=XElement.Parse(sr.ReadToEnd().Trim()); var query = tempX.Elements("fault").Elements("value").Elements("struct").Elements("member").Elements("name"); foreach (XElement x in query) { if (x.Value == "faultString") { throw new Exception(x.Parent.Elements("value").First().Value); } } if (tempX.Name.ToString()== "methodResponse") { return tempX; } else { throw new Exception("This is not an XML-RPC server!"); } }
小小的介绍结束了。