第三篇 XML 远程通讯服务 ( 一 )
互联网有很多的通信方法, TCP/IP UDP/IP 等,虽然这些传输协议基本上是同一的协议标准进行传输和通信,但是过于低层。由于通信的复杂度,和系统数据存储的方式各有不同, XML 就成了最好的解决方案。 XML 的优势就在于跨平台远程通信服务,提高系统间的系统间系统工作能力。它让不同系统中的应用可以使用标准的格式进行通信, XML 是 ASCII 的数据,所有系统间差异非常小。
在
WebServer
中常用的有两种技术。一种是
XML-RPC
协议,另一种是
SOAP
协议。
XML-RPC
和
SOAP
都是基于
XML
的协议。
传输原理图( SOAP 不止基于 http 协议,其他传输协议也可以实现)
XML-RPC
XML_RPC 是一个请求 - 响应协议,实现跨 Internet 过程调用的规范和实现。利用 HTTP 作为传输协议,使用 XML 作为消息请求的传输主体。请求和返回包都是 XML 格式。对不同的值类型进行规定了一系列的标量类型,所有数据都进行了标准化的转换。
上面的传输原理图,详细的说明了 XML_RPC 的传输原理和工作方式。
下面对传输结构进行具体说明:
请求结构
POST /WebService/rpc_server.php HTTP/1.0
User_Agent: XML-RPC Client
Host: 192.168.4.142
Content-Type: text/xml
Content-Length: 657
<?xml version="1.0" encoding="utf-8"?>
<methodCall
>
<methodName
>CheckMember</methodName
>
<params
>
<param
>
<value
>
<struct
>
<member
>
<name
>no</name
>
<value
>
<string
>***************</string
>
</value
>
</member
>
</struct
>
</value
>
</param
>
</params
>
</methodCall
>
|
上面是一个请求结构的消息体内容,重要信息已经用粗体进行了。
主要有三部分重要信息:
第一.信息头,说明请求信息的格式,和基本信息。 Content-Type: text/xml
第二. <methodCall> 请求标记。 RPC 请求调用固定标记。
第三. <methodName> 远程调用函数名标记。 Value 是调用函数名,其格式是 RPC 请求调用固定标记。
相应结构
<?xml version="1.0" encoding="utf-8"?>
<methodResponse
>
<params
>
<param
>
<value
>
<array
>
<data
>
<value
>
<string
>Y</string
>
</value
>
</data
>
</array
>
</value
>
</param
>
</params
>
</methodResponse
>
|
上面是一个响应结构的消息体内容,重要信息已经用粗体进行了。
<methodResponse> 是返回标记,其下面的第一个子元素用来判断相应是否正常。子元素是 <params> ,表明正常响应; <fault> 表明错误响应。
如果正常响应 <params> 子元素下还有一个或多个子元素 <params> ,此 <params> 包含着返回值。
如果是错误响应 <fault> 子元素下有两个成员元素 <faultCode><faultString> 。 <faultCode> 数值型返回错误编码, <faultString> 字符串型返回错误信息。
客户端 DEMO:
<?php /** * 函数:提供给客户端进行连接 XML-RPC 服务器端的函数 * 参数: * $host 需要连接的主机 * $port 连接主机的端口 * $rpc_server XML-RPC 服务器端文件 * $request 封装的 XML 请求信息 * 返回:连接成功成功返回由服务器端返回的 XML 信息,失败返回 false */ function rpc_client_call($host, $port, $rpc_server, $request) {
// 打开指定的服务器端 $fp = fsockopen($host, $port);
// 构造需要进行通信的 XML-RPC 服务器端的查询 POST 请求信息 $query = "POST $rpc_server HTTP/1.0/nUser_Agent: XML-RPC Client/nHost: ".$host."/nContent-Type: text/xml/nContent-Length: ".strlen($request)."/n/n".$request."/n"; // 把构造好的 HTTP 协议发送给服务器,失败返回 false if (!fputs($fp, $query, strlen($query))) { $errstr = "Write error"; return false; }
// 获取从服务器端返回的所有信息,包括 HTTP 头和 XML 信息 $contents = ''; while (!feof($fp)) { $contents .= fgets($fp); }
// 关闭连接资源后返回获取的内容 fclose($fp); return $contents; } // 构造连接 RPC 服务器端的信息 $host = '192.168.4.142'; $port = 80; $rpc_server = "/WebService/rpc_server.php";
$output = array( "output_type" => "xml", "verbosity" => "pretty", "escaping" => array("markup"), "version" => "xmlrpc", "encoding" => "utf-8");
$array = array( 'no'=>'101120155204', 'id'=>'132428196902282614', 'name'=>' 王占书 ', 'sec'=>'2EC6BAA7DD944E0D897BF0A292E27766');
// 把需要发送的 XML 请求进行编码成 XML ,需要调用的方法是 CheckMember ,参数是 $array $request = xmlrpc_encode_request("CheckMember", $array, $output);
// 调用 rpc_client_call 函数把所有请求发送给 XML-RPC 服务器端后获取信息 $response = rpc_client_call($host, $port, $rpc_server, $request); $split = "<?xml version=/"1.0/" encoding=/"utf-8/"?>"; $xml = explode($split, $response); $xml = $split . array_pop($xml); echo $xml; |
客户端 DEMO:
<?php
/** * 函数:提供给 RPC 客户端调用的函数 * 参数: * $method 客户端需要调用的函数 * $params 客户端需要调用的函数的参数数组 * 返回:返回指定调用结果 */ function rpc_server_func($method, $params) { ……………… }
// 产生一个 XML-RPC 的服务器端 $xmlrpc_server = xmlrpc_server_create ();
// 注册一个服务器端调用的方法 rpc_server ,实际指向的是 rpc_server_func 函数 xmlrpc_server_register_method ($xmlrpc_server, "CheckMember" , "rpc_server_func" );
// 接受客户端 POST 过来的 XML 数据 $request = $HTTP_RAW_POST_DATA ;
$output_options = array ( "output_type" => "xml" , "verbosity" => "pretty" , "escaping" => array ( "markup" ), "version" => "xmlrpc" , "encoding" => "utf-8" );
// 执行调用客户端的 XML 请求后获取执行结果 $xmlrpc_response = xmlrpc_server_call_method ($xmlrpc_server, $request, null , $output_options);
// 把函数处理后的结果 XML 进行输出 header( 'Content-Type: text/xml' ); echo $xmlrpc_response;
// 销毁 XML-RPC 服务器端资源 xmlrpc_server_destroy ($xmlrpc_server); |