简单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
<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
$soapClient = new SoapClient("test.wsdl");
echo $soapClient->helloworld('lake','123456');
?>
3.soapserver.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里可设置。