XML-RPC是一种简单的,轻量级的通过HTTP协议进行RPC通信的规范。一个XML-RPC消息就是一个请求体为XML的HTTP-POST请求,被调用的方法在服务器端执行并将执行结果以XML格式编码后返回。 XML-RPC 和SOAP是创建web services的两种标准协议。XML-RPC是出现较早的(也比较简单),而SOAP较新,也比较复杂。Microsoft的.NET就是基于 SOAP,而很多流行的WEB程序,如Frontier和blogger,则提供XML-RPC接口。
PHP通过xmlrpc扩展提供SOAP和XML-RPC的访问途径。xmlrpc基于xmlrpc-epi项目(更多信息请查看http://xmlrpc-epi.sourceforge.net)。xmlrpc扩展默认是不可用的,你需要在编译PHP时加上–with-xmlrpc选项来启用该扩展。
以下是通过ethereal抓到的一个典型的XML-RPC调用包(为便于阅读,进行了格式化):
1. 请求报文格式
2. 报文返回格式
而对应的返回数据包为:
其格式很简单,几乎是不言自明的,分别用methodCall和methodResponse标签标识发送给Server的调用请求和Server的返回结果,请求方法的名称用methodName标识,参数用params和param标识,而参数的类型标签则如下表所示:
示例
XML-RPC需要PECL扩展支持,在Windows下,对应的dll文件是:PHP_xmlrpc.dll
写一个XML-RPC服务器
客户端
XML-RPC客户端的主要工作是发出HTTP请求和解析服务器发回的响应。PHP所带的xmlrpc扩展可以将XML-RPC请求用XML编码,但它不知道如何发送HTTP请求。如果要具有这样的功能,可以从http://xmlrpc-epi.sourceforge.net下载xmlrpc-epi程序包,然后安装其中的sample/utils/utils.PHP文件。该文件包含一个可以执行HTTP请求的函数。
PHP通过xmlrpc扩展提供SOAP和XML-RPC的访问途径。xmlrpc基于xmlrpc-epi项目(更多信息请查看http://xmlrpc-epi.sourceforge.net)。xmlrpc扩展默认是不可用的,你需要在编译PHP时加上–with-xmlrpc选项来启用该扩展。
以下是通过ethereal抓到的一个典型的XML-RPC调用包(为便于阅读,进行了格式化):
1. 请求报文格式
- POST /xmlrpc HTTP/1.1
- Content-Type: text/xml
- User-Agent: Apache XML RPC 3.0 (Jakarta Commons httpclient Transport)
- Host: 135.252.156.147:8080
- Content-Length: 260
- <?xml version="1.0" encoding="UTF-8"?>
- <methodCall xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
- <methodName>Calculator.add</methodName>
- <params>
- <param>
- <value>
- <i4>2</i4>
- </value>
- </param>
- 3</i4>
- </params>
- </methodCall>
2. 报文返回格式
而对应的返回数据包为:
HTTP/1.1 200 OK
Server: Apache XML-RPC 1.0
Connection: close
189
<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
5</i4>
</methodResponse>
其格式很简单,几乎是不言自明的,分别用methodCall和methodResponse标签标识发送给Server的调用请求和Server的返回结果,请求方法的名称用methodName标识,参数用params和param标识,而参数的类型标签则如下表所示:
示例
XML-RPC需要PECL扩展支持,在Windows下,对应的dll文件是:PHP_xmlrpc.dll
写一个XML-RPC服务器
- <?PHP
- //该函数暴露给客名端的名称为“multiply( )”
- function times ($method, $args) {
- return $args[0] * $args[1];
- }
- $request = $HTTP_RAW_POST_DATA;
- if (!$request) $request_xml = $HTTP_POST_VARS['xml'];
- $server = xmlrpc_server_create( );
- if (!$server) die("Couldn't create server");
- xmlrpc_server_register_method($server, 'multiply', 'times');
- $options = array('output_type' => 'xml', 'version' => 'auto');
- echo xmlrpc_server_call_method($server, $request, null, $options);
- xmlrpc_server_destroy($server);
- ?>
客户端
XML-RPC客户端的主要工作是发出HTTP请求和解析服务器发回的响应。PHP所带的xmlrpc扩展可以将XML-RPC请求用XML编码,但它不知道如何发送HTTP请求。如果要具有这样的功能,可以从http://xmlrpc-epi.sourceforge.net下载xmlrpc-epi程序包,然后安装其中的sample/utils/utils.PHP文件。该文件包含一个可以执行HTTP请求的函数。
require_once('utils.PHP');
$options = array('output_type' => 'xml', 'version' => 'xmlrpc');
$result = xu_rpc_http_concise(
array(method => 'multiply',
args => array(9, 6),250); line-height:18px"> host => 'localhost',250); line-height:18px"> uri => '/PHP/rpc_webservice/xmlrpc_server.PHP',250); line-height:18px"> options => $options)
);
//echo $result;
echo "9 * 6 is $result";
?>
还有一些XML-RPC特性这里未提及,如XML-RPC的数据类型并不总是与PHP的数据类型精确对应,但可以将这些值编码成特殊的数据类型而不采用 xmlrpc扩展通过最佳猜测选择的数据类型。当然,PHP的xmlrpc扩展的一些特性我们也没有介绍,如SOAP错误。想知道全部细节,请查看http://www.PHP.net,上面有xmlrpc扩展的详细文档。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。