zoukankan      html  css  js  c++  java
  • 实战WebService I: XMLPRC篇(基于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 /xmlrpc HTTP/1.1  
    2. Content-Type: text/xml  
    3. User-Agent: Apache XML RPC 3.0 (Jakarta Commons httpclient Transport)  
    4. Host: 135.252.156.147:8080  
    5. Content-Length: 260  
    6. <?xml version="1.0" encoding="UTF-8"?>  
    7. <methodCall xmlns: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.1 200 OK  
    2. Server: Apache XML-RPC 1.0  
    3. Connection: close  
    4. Content-Type: text/xml  
    5. Content-Length: 189  
    6. <?xml version="1.0" encoding="UTF-8"?>  
    7. <methodResponse xmlns: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.  function times ($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.    
    9.  $server = xmlrpc_server_create(  );  
    10.    
    11.  if (!$server) die("Couldn't create server");  
    12.  xmlrpc_server_register_method($server, 'multiply''times');  
    13.  $options = array('output_type' => 'xml''version' => 'auto');  
    14.  echo xmlrpc_server_call_method($server, $request, null, $options);  
    15.    
    16.  xmlrpc_server_destroy($server);  
    17. ?>  



    客户端 

    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(96),  
    7.           host     => 'localhost',  
    8.           uri      => '/php/rpc_webservice/xmlrpc_server.php',  
    9.           options => $options)  
    10.   );  
    11.   //echo $result;  
    12.   echo "9 * 6 is $result";  
    13. ?>  



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

  • 相关阅读:
    3.27 课堂 笔记
    第四周 4-2
    3-26
    Java EE期末项目
    条件查询、SQL、JPQL、HQL比较
    J2EE 第八周(04.23-04.29)
    J2EE 第七周(04.16-04.22)
    J2EE 第六周(04.09-04.15)
    J2EE 第五周(04.02-04.08)
    J2EE 第四周(03.26-04.01)
  • 原文地址:https://www.cnblogs.com/liangle/p/2512579.html
Copyright © 2011-2022 走看看