Typecho支持XML-RPC,但是奈何网络上相关的资料实在是少,于是只有自己从零开始了

前言

因为之前并没有深入了解XML-RPC,仅仅只是在一些文章中见过这个名词,于是借助了搜索引擎,了解了XML-RPC到底是什么。
下面是来自维基百科的描述:

XML-RPC是一个远程过程调用的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为发送机制。
根据网络上的资料进行总结,该协议通信流程如下:

  1. 由XML-RPC客户端向XML-RPC服务端发送HTTP的POST请求,请求内容是一个确定格式XML文档
  2. XML-RPC服务端接收到该请求后,执行XML文档中描述的方法名,并将返回结果以XML文档的形式返回给XML-RPC客户端

在Typecho上支持该协议,即Typecho可以作为XML-RPC服务端,接受来自XML-RPC客户端的请求。

XML-RPC规范

对于XML文档的格式在网络上的资料非常多,参考自XML-RPC规范中文版

请求头

以下是一个请求头

POST addr HTTP/1.1
Host: Domain
Content-Type: text/xml
Content-Length: 449

对于Typecho来说XML-RPC的请求地址为

http://Domain//index.php/action/xmlrpc

注意Domain为博客的域名

对于Typecho的XML-RPC调用地址,在Typecho博客的首页中的head标签中,会在其中的link标签的herf属性中,包括pingback也是。

对于Typecho的XML-RPC调用地址,之前踩了不少坑,因为在网络上几乎没有Typecho的XML-RPC的资料,仅有的一点资料也是5、6年前的,在一些资料的描述上提到Typecho的XML-RPC调用地址为http://Domain//action/xmlrpc,然后就是ERROR 404 NOT FOUND,然后所幸在V2EX上有人提到调用地址应该是http://Domain//index.php/action/xmlrpc,尝试之后终于不是404了

请求体

以下是一个请求体

<?xml version=\"1.0\"?>
<methodCall>
    <methodName>wp.getAuthors</methodName>
    <params>
        <param>
            <value>
                <int>0</int>
            </value>
        </param>
        <param>
            <value>
                <string>user</string>
            </value>
        </param>
        <param>
            <value>
                <string>keyword</string>
            </value>
        </param>
    </params>
</methodCall>

具体介绍参见XML-RPC规范中文版

从该Demo中不难看出:

  1. methodName为要调用的方法名
  2. params为方法所需要的参数
  3. 在params内的一个param代表一个参数

根据Typecho的varWidgetXmlRpc.php文件的最下方的$api处即为接口列表,左侧为XML-RPC的方法名

响应体

出现错误时的响应体

方法调用成功,但是用户名或密码错误

<?xml version="1.0"?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value><int>403</int></value>
        </member>
        <member>
          <name>faultString</name>
          <value><string>无法登陆, 密码错误</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>

在服务端没有该方法

<?xml version=\"1.0\"?>
<methodResponse>
    <fault>
        <value>
            <struct>
                <member>
                    <name>faultCode</name>
                    <value>
                        <int>-32601</int>
                    </value>
                </member>
                <member>
                    <name>faultString</name>
                    <value>
                        <string>server error. requested method wpGetAuthors does not exist.</string>
                    </value>
                </member>
            </struct>
        </value>
    </fault>
</methodResponse>

正常的响应体

成功调用wp.getAuthors方法时返回的信息

<?xml version=\"1.0\"?>
<methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <struct>
                                <member>
                                    <name>user_id</name>
                                    <value>
                                        <string>1</string>
                                    </value>
                                </member>
                                <member>
                                    <name>user_login</name>
                                    <value>
                                        <string>test</string>
                                    </value>
                                </member>
                                <member>
                                    <name>display_name</name>
                                    <value>
                                        <string>test</string>
                                    </value>
                                </member>
                            </struct>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodResponse>

发送请求

可以到Post HTTP Requests Online网站上在线测试XML-RPC接口

结语

在测试Typecho的XML-RPC接口的时候,因为不会php,而且因为是第一次接触XML-RPC出现了各种错误

  1. 上面提到的XML-RPC调用地址的错误
  2. 误解了方法名,以为在api列表右边的是XML应该填的方法名
Last modification:April 15th, 2020 at 09:10 am