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);
?>