第四篇 XML 远程通讯服务 ( 二 )
上一篇,对 XML-RPC 进行了简单的介绍,并写了一个我自己程序里的例子。我现在介绍一下 SOAP (简单对象访问协议), SOAP 要比 XML-RPC 简单多了。 SOAP 的工作原理图与第三篇( XML 远程通讯服务 ( 一 ) )中的 XML-RPC 原理图基本原理一致,只是 SOAP 不止可以与 HTTP 协议结合使用,其他传输协议也可以。比如: SMTP 、 MIME..
SOAP 最主要的工作是使用标准的 XML 描述了 RPC 的请求信息 (URI/ 类 / 方法 / 参数 / 返回值 ) , SOAP 也是一段 XML ,通过传输协议发送它至目标对象。 SOAP 与 RPC 一样都是跨语言、跨平台的。
SOAP 请求方结构
POST /WebService/SoapServer.php HTTP/1.0
User_Agent: PEAR-SOAP 0.7.1
Host: 192.168.4.142
Content-Type: text/xml;charset=UF-8
Content-Length: 657
SOAPAction:
“”
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV
="http://schemas.xmlsoap.org/soap/envelope/"
><SOAP-ENV:Body
>
<SOAP-ENV:Body
>
******************
</SOAP-ENV:Body
></SOAP-ENV:Envelope
>
|
SOAP 返回放结构
HTTP/1.1 200 OK
Date: Thu, 12 May 2011 07:58:00 GMT
Server: Apache/2.2.17 (Unix) PHP/5.2.14
X-Powered-By: PHP/5.2.14
Content-Length: 65
Content-Type: text/XML; charset=UF-8
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV
="http://schemas.xmlsoap.org/soap/envelope/"
><SOAP-ENV:Body
>
<SOAP-ENV:Body
>
******************
</SOAP-ENV:Body
></SOAP-ENV:Envelope
>
|
上面是截取的网络传输信息。
在使用方面 SOAP 可比 XML-RPC 简单太多了,下面是我曾经写过的一个例子(无 WSDL )。
SOAP 服务器端:
include_once 'soapfunc.php' ; //$soap = new SoapServer ( "soap.wsdl", array('soap_version' => SOAP_1_2,'encoding'=>'UTF-8')); // 使用 WSDL $soap = new SoapServer ( null , array ( 'location' => "http://" . $_SERVER [ "HTTP_HOST" ] . "/WebService/soapserver.php" , 'uri' => "http://" . $_SERVER [ "HTTP_HOST" ] . "/WebService/" , 'encoding' => 'UTF-8' ) );
$soap->addFunction ( 'CheckMember' ); // 添加方法 $soap->addFunction ( SOAP_FUNCTIONS_ALL ); $soap->handle (); |
SOAP 客户端:
$client = new SoapClient( null , array ( 'location' => "http://192.168.4.142/WebService/soapserver.php" , 'uri' => "http://192.168.4.142/WebService/" )); $array = array ( 'no' => **** ); $result = $client->CheckMember($array); |
简单吧!
SOAP 扩展还支持 WSDL , WSDL ( Web Services Description Language )它是描述 web 服务的,是描述怎样访问 web 服务的, WSDL 是用来描述 SOAP 的,是描述 Web 服务的 XML 词汇集。换句话说, WSDL 文件告诉你调用 SOAP 所需要知道的一切,省的去编写开发文档来告诉调用函数的方法、参数、返回值,它对 WEB 服务的调用函数及其具体参数、返回值有了详细的说明, WSDL 也是一段 XML 。现在各个语言对 WSDL 的支持都很成熟,可以根据同一份 WSDL 文件生成自己语言的客户端。
WSDL 文件包括 7 部分 :types, Message, Part , Operation , PortType,Binding 和 service 七部分 .
1 Types 定义:类型定义 , 独立于语言 . 对应于 SOAP 消息中要传输的元素 数据类型定义( string 、 int )
2 Message : 要传递的数据。每个 web 方法对应两个 message 定义 in 和 out. 而 message 的定义包含了头和体
3 Part :消息参数
4 Operation :服务支持的操作的抽象描述
5 portType/ Interface : 一个或多个端点支持的操作的抽象集;每个 web service 对应一个 PortType, 该 PortType 中又包含了对其发布的方法。 此名称也已更改,因此可能会遇到两者中的任何一个。
6 Bindings :指定每 porttype 中每个操作 ( 类以及方法 ) 的绑定信息 , 包含 input 和 output 的消息的格式 .
7 service :每个 web service 绑定的 port 信息。
使用 WSDL ,程序更加简单。只需要在客户端和服务器端在实例化类 SoapClient 和 SoapServer 时,将 wsdl 文件当做参数就可以了。
实话实说, WSDL 的编写确实非常麻烦,手工编写的成功率基本上很低,一般都是通过工具来实现,我使用 ZendStudio 和 VisualStudio 进行生成。具体的生成方法网上有很多文章。
写了3天终于将文章全部写完了,我对 XML 尤其是 Web 服务的梳理就告一段落了,怕自己忘掉,写下来。 有不对的地方,请大家给我指明。