PHP中XML通信应用(三 XML远程通讯服务(一))

第三篇   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);

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值