简单web service实现

首先,web service 三要素是

 

1.xml格式的soap信息,头部以http协议发送,其发送格式类似以下

 

<!--http 头信息-->
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 1024

 

<?xml version="1.0"?>

 

<!-- 根元素,表明此xml格式数据为soap信息 -->
<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服务端的方法,以及参数-->
  <soap:Body> 

 

<!--方法名-->

 

   <methodname>

 

<!--参数名以及值-->
      <param>hello world<param>
    <methodname>
  </soap:Body>
 
</soap:Envelope>

 

 

 

 

response格式则是对应的的http响应头,以及类似发送的xml格式的soap返回信息(参阅http://www.w3school.com.cn/soap/soap_example.asp)

 

2.描述client端如何访问server端方法的wsdl(web service description language),是xml格式。

 

3.还有个uddi

 

因为要在本地实现简单的web service,故忽略uddi.

 

一个完整的web service请求是这样的:

 

========================================================================

 

client->request(http head+soap xml)->wsdl->server->handle function->response(http head+soap xml)->client

 

=========================================================================

 

wsdl起着通道的作用,接收到请求信息,引导至服务端相应的操作。

 

而请求端与服务响应端可为不同平台,不同语言,只要同样都读懂wsdl文件.

 

说白了,web service就是根据各语言都可解析xml的情况,利用xml作为各不同的开发语言之间的信息桥梁。

 

以下是简单的本地web service php实现,3个文件均位于http://localhost/lake/soap/目录下

 

1.wsdl文件:test.wsdl

 

 

 

<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='lake'
  targetNamespace
='http://localhost/lake/soap'
  xmlns:tns
='http://localhost/lake/soap'
  xmlns:soap
='http://schemas.xmlsoap.org/wsdl/soap/'
  xmlns:xsd
='http://www.w3.org/2001/XMLSchema'
  xmlns:soapenc
='http://schemas.xmlsoap.org/soap/encoding/'
  xmlns:wsdl
='http://schemas.xmlsoap.org/wsdl/'
  xmlns
='http://schemas.xmlsoap.org/wsdl/'>
 
<message name='getRequest'>
  
<part name='name' type='xsd:string'/>
  
<part name='pass' type='xsd:string'/>
</message>
<message name='getResponse'>
  
<part name='Result' type='xsd:string'/>
</message>
 
<portType name='class'>
  
<operation name='helloworld'>
    
<input message='tns:getRequest'/>
    
<output message='tns:getResponse'/>
  
</operation>
</portType>
 
<binding name='class' type='tns:class'>
  
<soap:binding style='rpc'
    transport
='http://schemas.xmlsoap.org/soap/http'/>
  
<operation name='helloworld'>
    
<soap:operation soapAction=''/>
    
<input>
      
<soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    
</input>
    
<output>
      
<soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    
</output>
  
</operation>
</binding>
 
<service name='class'>
  
<port name='goforsoap' binding='class'>
    
<soap:address location='http://localhost/lake/soap/soapserver.php'/>
 
  
</port>
</service>
</definitions>

 <portType>是整个wsdl文件的核心,相当于wsdl的类,下面定义类的方法,即可认为<portType>就是定义web service所提供的服务,类似以上

 

<portType name='class'>:我有一个叫class的类

 

<opration name='helloword'>:我class类下有一方法名叫helloworld

 

<input message='...'> : 客户端请求呼叫服务器端helloworld方法时的参数描述名,对应上面的message标签的name

 

<output message='...'>:服务端返执行helloworld方法返回值的描述,对应上面的message标签的name

 

然后往上看,有两个<message>标签,就是对input,output参数的描述,类型,参数名等。

 

<binding>即绑定soap协议,具体参考http://www.w3school.com.cn/上对wsdl格式的详解

 

最后当然要定义web service所在目标地址了,我将在http://localhost/lake/soap/下建立个soapserver.php作为web service文件,so...

 

注意<port>里面的binding属性一定要设置成之前定义的名为class的类

 

定义完wsdl,剩下的就简单了

 

2.soapclent.php

 

<?php
$soapClient = new SoapClient("test.wsdl");
echo $soapClient->helloworld('lake','123456');
?>

3.soapserver.php

 

<?php
class serverClass
{
    
function helloworld($name,$pass)
    {
        
return "i got that you are {$name},and your password is {$pass}";
    }
}
$soapServer = new SoapServer("test.wsdl");
$soapServer->setClass('serverClass');
$soapServer->handle();
?>

浏览器打开http://localhost/lake/soap/soapclient.php,不出意外就出现i got that you are lake,and your password is 1234567这样的返回串了。

 

记得关闭wsdl缓存,以及打开openssl扩展,在php.ini里可设置。

 

 

 

 

 

posted @ 2009-06-18 00:16  一缕青烟  阅读(271)  评论(0编辑  收藏  举报