PHP SOAP详解

1、什么是Web Service
Web Services可以将应用程序转换为网络应用程序。
Web Services被通过Web进行发布、查找和使用。
通过使用Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。
Web Services可以被其他应用程序使用。
基本的Web Services平台是XML+HTTP。
Web services使用XML来编解码数据,并使用SOAP来传输数据。
Web Services是应用程序组件
Web Services使用开放协议进行通信
Web Services是独立的(self-contained)并可自我描述
Web Services可通过使用UDDI来发现
Web Services可被其他应用程序使用
XML是Web Services的基础
基础的Web Services平台是XML + HTTP。
HTTP协议是最常用的因特网协议。
XML提供了一种可被用于不同的平台和编程语言之间的语言。
Web services平台的三种元素:
SOAP (简易对象访问协议)
UDDI (通用描述、发现及整合)
WSDL (Web services描述语言)
有一些功能是不同的应用程序常常会用到的。那么为什么要周而复始地开发它们呢?
Web services可以把应用程序组件作为服务来提供,比如汇率转换、天气预报或者甚至是语言翻译等等。
比较理想的情况是,每种应用程序组件只有一个最优秀的版本,这样任何人都可以在其应用程序中使用它。
2、什么是SOAP?
SOAP指简易对象访问协议或者可以更简单地说:SOAP是一种用于访问web service的协议。
SOAP是一种通信协议 
SOAP用于应用程序之间的通信 
SOAP是一种用于发送消息的格式 
SOAP被设计用来通过因特网进行通信 
SOAP独立于平台 
SOAP独立于语言 
SOAP基于XML 
SOAP很简单并可扩展 
SOAP运许您绕过防火墙 
SOAP将被作为W3C标准来发展 
3、SOAP 消息的基本结构

<?xml version="1.0"?>
	<soap:Envelope
	xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
	soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">


	<soap:Header>
	  ...
	  ...
	</soap:Header>


	<soap:Body>
	  ...
	  ...
	  <soap:Fault>
	    ...
	    ...
	  </soap:Fault>
	</soap:Body>


	</soap:Envelope>

4、什么是WSDL 
WSDL是基于XML的用于描述Web Services以及如何访问Web Services的语言。
WSDL指网络服务描述语言 
WSDL使用XML编写 
WSDL是一种XML文档 
WSDL用于描述网络服务 
WSDL也可用于定位网络服务 
WSDL还不是W3C标准 
WSDL文档主要结构
	<definitions>
	<types>
	   definition of types........
	</types>
	<message>
	   definition of a message....
	</message>
	<portType>
	   definition of a port.......
	</portType>
	<binding>
	   definition of a binding....
	</binding>
	</definitions>
5、什么是UDDI?
UDDI是一种目录服务,通过它,企业可注册并搜索Web services。
UDDI指通用的描述、发现以及整合(Universal Description, Discovery and Integration)。 
UDDI是一种用于存储有关web services的信息的目录。 
UDDI是一种由WSDL描述的网络服务接口目录。 
UDDI经由SOAP进行通迅。 


6、UDDI 如何被使用
假如行业发布了一个用于航班比率检测和预订的 UDDI 标准,航空公司就可以把它们的服务注册到一个 UDDI 目录中。然后旅行社就能够搜索这个 UDDI 目录以找到航空公司预订界面。当此界面被找到后,旅行社就能够立即与此服务进行通信,这样由于它使用了一套定义良好的预订界面。


7、XML-RPC 
Web Service就是为了异构系统的通信而产生的,它基本的思想就是使用基于XML的HTTP的远程调用提供一种标准的机制,而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。 PHP中集成了XML-RPC和SOAP两种协议的访问 不管是XML-RPC也好,SOAP也罢,只要能够让我们稳定、安全的进行远程过程的调用,完成我们的项目,那么就算整个Web Service就是成功的。 


8、Web Service 实例
任何应用程序都可拥有Web Service组件。
Web Services的创建与编程语言的种类无关。


安装:


为了公开接口,被其他的应用程序调用,经常需要创建SOAP端,而在PHP中,SOAP的使用自从PHP4就有了 广泛的使用,开源的例如nosoap都是很不错的SOAP类,在PHP5开始,就已经支持SOAP
php5自带了一个开发web service的扩展extension=php_soap.dll;
在php.ini中加入上面扩展;同时配置ini文件的以下选项
Name                   Default Changeable  Changelog
soap.wsdl_cache_enabled  "1"    PHP_INI_ALL Available since PHP 5.0.0.
soap.wsdl_cache_dir    "/tmp"   PHP_INI_ALL Available since PHP 5.0.0.
soap.wsdl_cache_ttl    "86400"  PHP_INI_ALL Available since PHP 5.0.0.
在phpinfo()中可以看到SOAP扩展。


扩展中的类: 
这个扩展实现了6个类。其中有三个高级的类,它们的方法很有用,它们是 SoapClient,SoapServer和SoapFault。
另外三个类除了构造器外没有其它别的方法,这三个是低级的类,它们是SoapHeader,SoapParam和SoapVar。

9、类讲解


SoapClient类 
这个类用来使用Web services。SoapClient类可以作为给定Web services的客户端。它有两种操作形式:


WSDL 模式
Non-WSDL 模式


在WSDL模式中,构造器可以使用WSDL文件名作为参数,并从WSDL中提取服务所使用的信息。
non-WSDL模式中使用参数来传递要使用的信息。这个类有许多可以用来使用服务的有用的方法。其中SoapClient::__soapCall()是最重要的。这个方法可以用来调用服务中的某个操作。 


SoapServer类 
这个类可以用来提供Web services。与SoapClient类似,SoapServer也有两种操作模式:WSDL模式和non-WSDL模式。这两种模式的意义跟 SoapClient的两种模式一样。在WSDL模式中,服务实现了WSDL提供的接口;在non-WSDL模式中,参数被用来管理服务的行为。
在SoapServer类的众多方法中,有三个方法比较重要。
SoapServer::setClass()方法设定用来实现Web Service的类。SoapServer::setClass所设定的类中的所有公共方法将成为Web Services的操作
SoapServer::addFunction()方法用来添加一个或多个作为Web Services操作的函数。
SoapServer:: handle()方法指示Web Service脚本开始处理进入的请求。Web Service脚本是用PHP脚本写的一个或多个SoapServer对象的实例。尽管你可以有不止一个的SoapServer对象,但通常的习惯是一个脚本只拥有一个SoapServer实例。在调用SoapServer::handle()方法之前,Web Service脚本会使用设置在SoapServer对象实例上的任何信息来处理进入的请求和输出的相应。
SoapFault类
这个类从Exception类继承而来,可以用来处理错误。SoapFault实例可以抛出或获取Soap错误的相关信息并按程序员的请求处理。 
SoapHeader类 
这个类可以用来描述SOAP headers。它只是一个只包含构造器方法的数据容器。 
SoapParam类 
SoapParam也是一个只包含构造器方法的数据容器。这个方法可以用来描述传递给Web services操作的参数。在non-WSDL模式中这是一个很有用的类,可以用来传递所期望格式的参数信息。 
SoapVar类 
SoapVar也是一个只包含构造器的低级类,与SoapHeader和SoapParam类相似。这个类可以用来给一个Web services操作传递编码参数。这个类对non-WSDL中传递类型信息是非常有用的。 
10、SOAP的使用 
1:创建您需要真正执行的程序,返回为一函数 
2.然后创建一个SOAPServer 
3.客户端访问 


不使用WSDL 的实例


例如需要查询当前的时间,我们创建获取目前时间的函数
可创建保存在soapfunction.php

        function GetTime(){
	     return date('Y-m-d',time());
	}
然后创建一个SOAPServer服务端
可以创建于soaps.php
        include_once('soapfunction.php');  //引入soap要执行的文件
	$soap = new SoapServer(null,array('uri'=>"http://www.5do8.com/webs/")); //创建SOA创建了一个SoapServer类,该类的第一个参数是wsdl,第二个参数是uri,php自带目前不支持自动生成wsdl,这个构造函数如果第一个参数是null,第二个是必填的,第二个参数就是命名空间,这是为了保证互联网WebServer的一致性和开发的一致性而产生的,你可以写入任何你想要的地址,无论存在与否。 
	$soap->addFunction('GetTime');
	$soap->handle();
可以创建SOAP客户端
可以创建于soapc.php
        $client = new SoapClient(null, array('location' =>"http://localhost/soap/soaps.php",'uri' => "http://www.5do8.com/webs/")); //建一个SoapClent,第一个参数还是wsdl,这里为null,第二个参数中必须包含命名空间(uri),这两个参数都要和需要访问的SoapServer一致,而执行地址(location)为SoapServer的php访问地址。
	$reversed = $client->GetTime();
	echo "获取到时间是:".$reversed;


基于WSDL 的实例


玩SOAP,最麻烦的莫过于WSDL的编写
因为SoapServer还没有提供生成wsdl的实现, 
但是不需要人写的。
先定义一个类 
文件 sum.php 

class Sum
	{
	    /**
	      * 求和
	      *
	      * @param float $x
	      * @param float $y
	      * @return float
	      */
	     public function add($x, $y)
	     {
		 return $x + $y;
	     }
	} 

创建WSDL 
这项是最麻烦的过程,但是,利用Zend Studio,一行xml也不用写,就能轻松搞定
步骤:
Tools(工具) ==> WSDL Generator ==> Configration name : fdxq520; WSDL file name: SUM ==>NEXT(下一步) ==> 点击 +   ==> 选择上面的创建的sum.php ==> 这时候会看到一个 classes   : URL Location的映射,保留 Sum 类前面的勾,并将其url 设置为 SOAP Server的url:http://localhost/server.php ==>点击Finish(完成),ZDE就会创建一个非常完美的WSDL
拷贝那个SUM.wsdl文件(默认在我的文档中)到apache目录下(localhost),
创建 SOAP Server 

server.php 

<?php
	require './sum.php';


	$server = new SoapServer('./SUM.wsdl');
	$server->setClass('Sum');
	$server->handle();
	?> 
创建SOAP客户端 

client.php 

<?php
	$soap = new SoapClient('./SUM.wsdl');
	echo $soap->add(3.1, 4.2);
	?> 










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值