利用PHP SOAP实现web service
一 什么是SOAP?可以做什么?
SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
• Envelope 元素,标识XML 文档一条 SOAP 消息
• Header 元素,包含头部信息的XML标签
• Body 元素,包含所有的调用和响应的主体信息的标签
• Fault 元素,错误信息标签。
二 什么是WSDL?可以做什么?
WSDL 指网络服务描述语言。是一种基于XML编写的文档。为用户提供详细的接口说明书。
怎样向别人介绍你的Web服务(Web Service)有哪些功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,甚至可能会口头告诉使用你Web服务的人。
这些非正式的的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web服务的时候,他们的开放环境无法给他们提供任何帮助,因为这些工具根本不了解你的Web服务.
解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web服务描述语言(WSDL)就是这样一个基于XML的语言。用于描述Web服务及其函数,参数,返回值。因是基于XML,所以WSDL即使机器可阅读,又是人可阅读的。
三 利用PHP SOAP实例Web Service
php有两个扩展可以实现web service,一个是NuSoap,一个是php 官方的soap扩展,由于soap是官方的,所以我们这里以soap来实现web service.由于默认是没有打开soap扩展的,所以自己先看一下soap扩展有没有打开。
在soap编写web service的过程中主要用到了SoapClient,SoapServer,SoapFault三个类。
SoapClient类
这个类用来使用Web services。SoapClient类可以作为给定Web services的客户端。
它有两种操作形式:
* WSDL 模式
* Non-WSDL 模式
在WSDL模式中,构造器可以使用WSDL文件名作为参数,并从WSDL中提取服务所使用的信息。
non-WSDL模式中使用参数来传递要使用的信息。
SoapServer类
这个类可以用来提供Web
services。与SoapClient类似,SoapServer也有两种操作模式:WSDL模式和non-WSDL模式。这两种模式的意义跟
SoapClient的两种模式一样。在WSDL模式中,服务实现了WSDL提供的接口;在non-WSDL模式中,参数被用来管理服务的行为。
在SoapServer类的众多方法中,有三个方法比较重要。它们是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。
四 实例
定义一个提供服务的php类,这个类所提供的函数就是web service对外提供的服务
Class PersonInfo { /** * 返回姓名 * @return string * */ public function getName($name){ return "My Name is " . $name; } }
下面给出服务器端的代码:
//包含提供服务的类进来 include 'test.php'; /* 创建soap服务端 参数1 : wsdl的URL地址,如果不是wsdl模式,传个NULL 参数2 : 如果是wsdl模式,可以不传.如果不是wsdl模式,传个数组.定义个uri子单元. */ $s = new SoapServer(null,array("uri"=>"此处随便写,只是命名空间")); //设置用于处理SOAP请求的类 $s -> setClass("PersonInfo"); //处理请求 $s -> handle();
下面给出客户端的代码:
try{ //创建soap的客户端 //参数1 wdsl地址 //参数2[location] 处理soap请求的地址. //参数2[uri] 命名空间 $soap = new SoapClient(null,array('location'=>"http://localhost/test2.php",'uri'=>'hwhwthhsdhg')); //两种调用方式,直接调用方法,和用__soapCall调用 echo $r = $soap->getName('tlijian1989'); }catch(SoapFault $e){ echo $e->getMessage(); }catch(Exception $e){ echo $e->getMessage(); }