实战WebService I: XML-PRC篇(基于php)

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. 请求报文格式
Java代码 收藏代码
  1. POST/xmlrpcHTTP/1.1
  2. Content-Type:text/xml
  3. User-Agent:ApacheXMLRPC3.0(JakartaCommonshttpclientTransport)
  4. Host:135.252.156.147:8080
  5. Content-Length:260
  6. <?xmlversion="1.0"encoding="UTF-8"?>
  7. <methodCallxmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
  8. <methodName>Calculator.add</methodName>
  9. <params>
  10. <param>
  11. <value>
  12. <i4>2</i4>
  13. </value>
  14. </param>
  15. <param>
  16. <value>
  17. <i4>3</i4>
  18. </value>
  19. </param>
  20. </params>
  21. </methodCall>


2. 报文返回格式

而对应的返回数据包为:

Java代码 收藏代码
  1. HTTP/1.1200OK
  2. Server:ApacheXML-RPC1.0
  3. Connection:close
  4. Content-Type:text/xml
  5. Content-Length:189
  6. <?xmlversion="1.0"encoding="UTF-8"?>
  7. <methodResponsexmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
  8. <params>
  9. <param>
  10. <value>
  11. <i4>5</i4>
  12. </value>
  13. </param>
  14. </params>
  15. </methodResponse>


其格式很简单,几乎是不言自明的,分别用methodCall和methodResponse标签标识发送给Server的调用请求和Server的返回结果,请求方法的名称用methodName标识,参数用params和param标识,而参数的类型标签则如下表所示:

示例

XML-RPC需要PECL扩展支持,在Windows下,对应的dll文件是:php_xmlrpc.dll
写一个XML-RPC服务器

Java代码 收藏代码
  1. <?php
  2. //该函数暴露给客名端的名称为“multiply()”
  3. functiontimes($method,$args){
  4. return$args[0]*$args[1];
  5. }
  6. $request=$HTTP_RAW_POST_DATA;
  7. if(!$request)$request_xml=$HTTP_POST_VARS['xml'];
  8. $server=xmlrpc_server_create();
  9. if(!$server)die("Couldn'tcreateserver");
  10. xmlrpc_server_register_method($server,'multiply','times');
  11. $options=array('output_type'=>'xml','version'=>'auto');
  12. echoxmlrpc_server_call_method($server,$request,null,$options);
  13. xmlrpc_server_destroy($server);
  14. ?>


客户端

XML-RPC客户端的主要工作是发出HTTP请求和解析服务器发回的响应。PHP所带的xmlrpc扩展可以将XML-RPC请求用XML编码,但它不知道如何发送HTTP请求。如果要具有这样的功能,可以从http://xmlrpc-epi.sourceforge.net下载xmlrpc-epi程序包,然后安装其中的sample/utils/utils.php文件。该文件包含一个可以执行HTTP请求的函数。

Java代码 收藏代码
  1. <?php
  2. require_once('utils.php');
  3. $options=array('output_type'=>'xml','version'=>'xmlrpc');
  4. $result=xu_rpc_http_concise(
  5. array(method=>'multiply',
  6. args=>array(9,6),
  7. host=>'localhost',
  8. uri=>'/php/rpc_webservice/xmlrpc_server.php',
  9. options=>$options)
  10. );
  11. //echo$result;
  12. echo"9*6is$result";
  13. ?>


还有一些XML-RPC特性这里未提及,如XML-RPC的数据类型并不总是与PHP的数据类型精确对应,但可以将这些值编码成特殊的数据类型而不采用 xmlrpc扩展通过最佳猜测选择的数据类型。当然,PHP的xmlrpc扩展的一些特性我们也没有介绍,如SOAP错误。想知道全部细节,请查看http://www.php.net , 上面有xmlrpc扩展的详细文档。



转载于:http://www.iteye.com/topic/152040



你可能感兴趣的:(webservice)