用户名:  密码:   
您当前的位置:首页 > 网页设计 >  PHP > 

第25讲 组成WS技术的xml文档及SOAP协议具体结构,WSDL语言,UDDI规范,PHP内置的SOAP类库,第三方扩展包NuSOAP

上次修改时间: 2016-03-22 15:01:49      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\PHP相关\      下一页

组成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;