

组成WS技术的xml文档及SOAP协议具体结构,WSDL语言,UDDI规范,PHP内置的SOAP类库,第三方扩展包NuSOAP
25.1 Web Service技术
1) 简称WS,可以跨平台,并提供各项服务的一种技术。
2) WS可以看作一个有接口能通过Web进行调用的程序,调用可以实现某个功能
3) 特点:基于WEB的无缝集成,WS提供一套标准数据类型用于在不同平台和编程语言间沟通
组成WS平台的三个技术,
SOAP(Simple Object Access Protocal,简单对象访问协议),
WSDL(Services Description Language,Web服务描述语言),
UDDI(Universal Discovery Description Integration, 通用发现,描述,集成)
25.2 SOAP协议,利用XML技术让应用程序跨http交换信息
1) SOAP是种轻量级协议,基于XML技术,遵循XML标准,一个SOAP包就是一个XML文档
2) SOAP独立于平台和语言,允许任何编程模型,不依赖RPC,
3) 可在几乎所有的传输协议上使用,可与多种因特网协议结合,如http,smtp,mime等
4) SOAP结构,下例xml文档主要由SOAP Envelope,SOAP Header和SOAP Body三部分组成
<?xml version="1.0" encoding="gb2312"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
<soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
<tm:Info xmlns:tm="http://www.bccd.com/php/"
soap:mustUnderstand="1">Tsoft</tm:Info>
</soap:Header>
<soap:Body xmlns:tm="http://bccd.com/PHP">
<tm:PHP_book>
<tm:Name>PHP</tm:Name>
</tm:PHP_book>
</soap:Body>
</soap:Envelope>
⑴ SOAP Envelope,Envelope(信封,封套)是SOAP中必须要有的根元素,结构如下:
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope" //这里必须要有,否则soap无效
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> //encodingstyle定义文档中数据类型,该属性可以任何元素中
..........
</soap:Envelope>
⑵ SOAP Header,包含Envelope的一些专用信息,该元素是可选的,若有该元素它必须是第一个子元素
<soap:Header>
<tm:Info xmlns:tm="http://www.bccd.com/php/"
soap:mustUnderstand="1">Tsoft</tm:Info>
</soap:Header>
//注:mustUnderstand是Header的属性,用以决定标识标题项对于要进行处理的接收者是否必须处理,1为必须,0表可选
⑶ SOAP Body 是Envelope根元素中的必要元素。用于错误处理的Fault元素是Body的子元素,没有Header元素Body就是根元素的第一个元素。否则它是第二个元素,因为header元素有就必须是第一个子元素
<soap:Body xmlns:tm="http://bccd.com/PHP">
<tm:PHP_book>
<tm:Name>PHP</tm:Name>
</tm:PHP_book>
</soap:Body>
5) SOAP Fault, 用以保存Soap中错误消息,如果有Fault元素,它必须是Body的子元素,且最多只能出现一次
Fault元素的4个子元素
<faultcode>:提供了故障代码,代码主要有4种,
VersionMismatch:处理方发现SOAP封装元素有不合法的命名空间
MustUnderstand: 不能处理header子元素,不mustUnderstand=1必须处理时,就不能理解
Client: 表消息格式错误或含有不正确信息
Server:表错误原因来自服务器
<faultstring>:提供错误解释信息,类似http中的Reason-Phrase
<faultactor>:提供导致错误发生的信息源
<detail>:用来保存与Body元素有关的错误信息,如body元素内容不能被解析,必须包含detail子元素
25.3 WSDL文档
1) WSDL是用XML语言来描述web service,通过WSDL可了解Web Service提供了那些方法,使用的协议和服务器地址
2) WSDL文档,文件后缀为wsdl,详细代码略。。。。。。。。
3) WSDL文档由5部分元素构成,文件就是一个xml文件
25.4 UDDI规范
始于2000年,为加速WS推广,由30多家公司创立了UDDI registries,推出基于标准的服务描述和发行规范
25.5 PHP内置SOAP类库
1) 配置php.ini,使PHP服务器支持SOAP函数,
a. 在php.ini文件中去掉extension=php_soap.dll前分号
b. 找到如下部分
[soap]
; Enables or disables WSDL caching feature.
soap.wsdl_cache_enabled=0 //这里为0,意为关闭WSDL缓存
; Sets the directory name where SOAP extension will put cache files.
soap.wsdl_cache_dir="e:\windows\temp" //这里为缓存目录
...
//将always_populate_raw_post_data设为on,并去掉前面的分号,表允许未格式的post数据
//完成后重启服务器,用phpinfo()可看到soap相关信息
2) 创建服务端页面
流程:实现函数功能——实例化对象——添加接口函数——调用对象句柄
客户端实际是通过服务器的接口函数来实现传值的功能,页面创建步骤:
实例化对象——调用接口函数——输出结果
例:server.php代码
function getBccd($user) {
return 'Hi '.$user.", You can see me.^_^";
}
$server = new SoapServer('tmbccd.wsdl');
$server->addFunction("getBccd");
$server->handel();
index.php页代码:
$client = new SoapClient("http://localhost/tm/sl/25/1/tmbccd.wsdl");
$return = $client->getBccd('spcn');
echo $return;
25.6 使用NuSOAP类库
1) 同于手动创建WSDL文档对新手来说较困难,可用第三方扩展包NuSOAP直接生成WSDL文档
2) NuSOAP是一源码开放的SOAP类库,可从网上下载解压,将解压的lib文件夹复制到服务器相庆目录下
注:由于NuSOAP类库名和服务器原有冲突,要将php.ini文件中的extension=php_soap.dll前加分号注释掉重启服务器,
3) 将lib包中主要包含三个类,soap_server, soapclient和soap_fault
4) 使用NuSOAP创建服务器页面的流程
载入nusoap类——实例化对象——配置WSDL文档——注册接口函数——函数功能实现 //最后可用对象中的service方法查看WSDL文档内容和接口信息
5) 使用NuSOAP创建客户端页面,方法比PHP内置SOAP类多一步加载过程,流程:
加载NuSOAP类——实例化对象——调用接口函数——输出返回信息
例:server.php页代码
include ('../lib/nusoap.php');
$server = new soap_server();
$server->configureWSDL('myBccd');
$server->register('getBccd',array('user'=>'xsd:string'),array('return'=>'xsd:string'));
function getBccd($user) {
return 'Succeed! '.$user. ',service is good.';
}
$server->service($HTTP_RAW_POST_DATA);
index.php页面代码:
include '../lib/nusoap.php';
$client = new soapclient('http://localhost/tm/sl/25/2/server.php?wsdl',true);
$return = $client->call('getBccd',array('user'=>'spcn'));
echo $return;