XML-RPC协议规范及实现类库

参考:http://www.xmlrpc.com/spec

http://zh.wikipedia.org/zh/XML-RPC

XML-RPC:

xml-rpc 是一套规范及其一系列的实现,允许运行在不同操作系统、不同环境的程序基于internet进行远程过程调用(remote procedure call,RPC)。这种远程过程调用使用http作为传输协议,xml作为传送信息的编码格式。XML-RPC的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。

 

XML-RPC是工作在internet上的远程过程调用协议。一个XML-RPC消息就是一个请求体为xml的HTTP-POST请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。
过程调用参数可以是标量、数值、字符串、日期等,也可以是复杂的记录或列表结构(list structures,即数组类型).


XML-RPC请求的例子:

 

 
  
POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

<? xml version="1.0" ?>
< methodCall >
< methodName > examples.getStateName </ methodName >
< params >
< param > < value >< i4 > 41 </ i4 ></ value > </ param >
</ params >
</ methodCall >


请求头部的要求:

 

第一行中,URI的格式可以不指定。例如,如果服务只处理XML-RPC调用, 它可以为空,或只是一个斜线。然而,如果服务器要处理各种HTTP请求,则我们应让URI能帮助将请求路由到处理这个XML-RPC请求的代码上。 (例子中,URI是/RPC2, 这告诉服务器将这个请求路由到“RPC2”应答程序上.)

User-Agent和Host必须指定.

Content-Type须是text/xml.

Content-Length必须指定且必须正确.

 

有效负载的格式:
有效的信息在一个单一的XML结构<methodCall> 中.

<methodCall> 须含有一个<methodName>子项,这是一个字符串,含有要调用的方法(过程)的名字。该字符串只能含有字母(大小写A-Z), 数字(0-9), 下划线, 点, 冒号和斜线(/). 服务器决定如何解释methodName的字符.
例如,methodName 可能是一个脚本的名字(脚本在接到某个请求时运行),可能是一个数据库表中某个记录的某个字段,或可能是一个含有目录和文件的结构的文件的路径名。
如果过程调用有参数则 <methodCall> 必须包含一个<params>子项. <params> 可以包含任意数量的 <param>子项, 每个<param>含有一个<value>子项.

标量数据类型(scalar )
参数值<value>可以是标量,用类型标签将值包括起来。如果没指定类型,则认为是string类型。类型标签如下表:
Tag Type Example
<i4> or <int> 4字节带符号整数值 -12
<boolean> 0 (false) or 1 (true) 1
<string> 字符串 hello world
<double> 双精度带符号浮点值 -12.214
<dateTime.iso8601> 日期/时间 19980717T14:08:55
<base64> base64编码的二进制数据 eW91IGNhbid0IHJlYWQgdGhpcyE=

结构数据类型(<struct>)
参数值也可以是<struct>类型一个<struct>可含有几个<member>项,每个<member>含有一个<name>项和一个<value>项。<member>的<value>值可以为任何类型,可为标量类型、<array>甚至<struct>(即可以递归).例子:
<struct>
   <member>
      <name>lowerBound</name>
      <value><i4>18</i4></value>
      </member>
   <member>
      <name>upperBound</name>
      <value><i4>139</i4></value>
      </member>
</struct>
数组数据类型(<array>)
参数值也可以是<array>类型一个<array>含有单一的 <data> 元素,<data>元素可以含有任意数量的<value>, 这里的<value>没有name.每个<value>的数据类型可各不相同,如下例所示。
<data>的<value>值可以为任何类型,可为标量类型、 <struct>甚至<array>(即可以递归).
<array>
   <data>
      <value><i4>12</i4></value>
      <value><string>Egypt</string></value>
      <value><boolean>0</boolean></value>
      <value><i4>-31</i4></value>
    </data>
</array>

XML-RPC应答的一个例子:

 

 
  
HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT

<? xml version="1.0" ?>
< methodResponse >
< params >
< param >
< value >< string > South Dakota </ string ></ value >
</ param >
</ params >
</ methodResponse >

 

除非有低层错误,总是要返回200 OK.

 

Content-Type须是 text/xml. Content-Length 必须出现且值准确.

应答包体是一个单一XML结构 <methodResponse>, 它可以包含单一的<params> ,<params>含有单一的<param>, <param> 含有单一<value>.

<methodResponse> 也可以包含一个<fault>, 它含有一个<struct>类型的<value>,这个<struct>中含有两个元素,一个名为<faultCode>的<int>值,一个名为 <faultString>的<string>.

<methodResponse>不能同时包含 <fault> 和<params>.

 

XML-RPC调用失败时的应答的例子:

 

 
  
HTTP/1.1 200 OK
Connection: close
Content-Length: 426
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:02 GMT
Server: UserLand Frontier/5.1.2-WinNT

<? xml version="1.0" ?>
< methodResponse >
< fault >
< value >
< struct >
< member >
< name > faultCode </ name >
< value >< int > 4 </ int ></ value >
</ member >
< member >
< name > faultString </ name >
< value >< string > Too many parameters. </ string ></ value >
</ member >
</ struct >
</ value >
</ fault >
</ methodResponse >

 

策略与目标:

Firewalls. 这个协议的目标,是在不同的环境之间,铺设一个兼容性的基础,它没有超越CGI能力的新功能。防火墙软件可以监视Content-Type为text/xml的post类型的请求。

Discoverability. 我们要求它是一个简单的、 干净的可扩展的的格式。它应该可能满足: 一个HTML编码器能够通过读一个含有XML-RPC的文件, 明白它在做什么, 且能修改它以及 在第一次或第二次请求时让它工作起来.

Easy to implement. 我们还要求它是一个易于实现的协议,能很快在其它的环境或操作系统上跑起来。

 

各种语言/平台的XML-RPC实现:

列表见:http://www.xmlrpc.com/directory/1568/implementations

几种常用的:

PHP: client/server (Keith Devens) http://keithdevens.com/software/xmlrpc

PHPXMLRPC(Useful, Inc.):http://phpxmlrpc.sourceforge.net/

Objective C: client/server (Marcus Müller) :http://www.mulle-kybernetik.com/software/XMLRPC/

Cocoa XML-RPC Framework(Client) http://divisiblebyzero.com/

转载于:https://www.cnblogs.com/elfsundae/archive/2010/12/24/1915460.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML-RPC是一种轻量级的远程过程调用(RPC协议,它使用XML格式来编码调用请求和响应。在Qt 5.9中,可以使用QXmlRpc库来实现XML-RPC客户端和服务端。 实现XML-RPC客户端 以下是使用QXmlRpcClient类实现XML-RPC客户端的示例代码: ```c++ #include <QtCore/QCoreApplication> #include <QtXmlRpc/QXmlRpcClient.h> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QUrl url("http://localhost:8000/RPC2"); // XML-RPC服务端的URL QXmlRpcClient client(url); // 调用XML-RPC方法 QVariantList params; params << 2 << 3; QXmlRpcValue result = client.call("sample.add", params); if (result.isValid() && result.type() == QXmlRpcValue::TypeInt) qDebug() << "Result:" << result.toInt(); else qDebug() << "Error:" << result.toString(); return app.exec(); } ``` 在上面的示例中,我们首先创建了一个QUrl对象来指定XML-RPC服务端的URL,然后使用QXmlRpcClient类创建了一个客户端对象。接下来,我们使用call()方法调用了一个名为“sample.add”的XML-RPC方法,并传递了两个整数作为参数。最后,我们检查了返回值的类型,并打印了结果或错误消息。 注意,调用XML-RPC方法是一个同步操作,它会阻塞当前线程,直到服务端返回结果或超时。 实现XML-RPC服务端 以下是使用QXmlRpcServer类实现XML-RPC服务端的示例代码: ```c++ #include <QtCore/QCoreApplication> #include <QtXmlRpc/QXmlRpcServer.h> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QXmlRpcServer server; server.registerMethod("sample.add", [&](QXmlRpcValue params, QXmlRpcValue& result) { if (params.isArray() && params.size() == 2 && params[0].type() == QXmlRpcValue::TypeInt && params[1].type() == QXmlRpcValue::TypeInt) { int a = params[0].toInt(); int b = params[1].toInt(); result = a + b; } else { result = "Invalid parameters"; } }); if (!server.listen(QHostAddress::Any, 8000)) { qDebug() << "Failed to start XML-RPC server"; return 1; } qDebug() << "XML-RPC server started on port 8000"; return app.exec(); } ``` 在上面的示例中,我们首先创建了一个QXmlRpcServer对象,然后使用registerMethod()方法注册了一个名为“sample.add”的XML-RPC方法。在回调函数中,我们首先检查传递的参数是否为两个整数,如果是,则将它们相加并将结果存储在返回值中。否则,我们将返回一个错误消息。 最后,我们使用listen()方法启动服务端,并检查是否成功。如果成功,我们打印一条消息表示服务端已经启动。 注意,启动XML-RPC服务端是一个异步操作,它会在另一个线程中运行,直到服务端停止或出现错误。在上面的示例中,我们使用app.exec()来保持主线程在运行状态,直到服务端停止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值