利用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();
}

 

 

 

posted @ 2014-03-24 16:43  tlijian1989  阅读(204)  评论(0编辑  收藏  举报