最近看了挺多關於php中webservice的資料,感謝燕十八的分享,幫助了我構建服務端的過程。將學習筆記記錄如下,其中包含燕十八的筆記。
WebService
1 快速了解WebService
通俗的說:按一定的XML格式,調用遠程服務器的方法,且服務器按一定的格式返回XML內容.
"一定的格式"----SOAP(Simple Object Access Protocol )簡單對象訪問協議是在分散或分布式的環境中交換信息的簡單的協議,是一個基於XML的協
議.
遠程服務器 ---- 一般通過HTTP協議來傳遞消息
總結: WebServie == HTTP協議 + Soap格式的XML
例1:soap請求
POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: webservice.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: 354
SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://WebXml.com.cn/getMobileCodeInfo >
2 PHP客戶端請求WebService
修改PHP.ini
extension=php_soap.dll 前的";"去掉.
並重啟apache
PHP SoapClient類可以用來請求WebService
$soap = new soapClient('http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL'); print_r($soap->getMobileCodeInfo( array('mobileCode'=>'13**********') ) );
Array ( [0] => getMobileCodeInfoResponse getMobileCodeInfo(getMobileCodeInfo $parameters) [1] => getDatabaseInfoResponse getDatabaseInfo(getDatabaseInfo $parameters) ) Array ( [0] => struct getMobileCodeInfo { string mobileCode; string userID; } [1] => struct getMobileCodeInfoResponse { string getMobileCodeInfoResult; } [2] => struct getDatabaseInfo { } [3] => struct getDatabaseInfoResponse { ArrayOfString getDatabaseInfoResult; } [4] => struct ArrayOfString {
string string;
}
// 調用方法 print_r($soap->getMobileCodeInfo( array('mobileCode'=>'13426060134') ) );
返回結果
stdClass Object ( [getMobileCodeInfoResult] => 13*********:北京 北京 北京移動動感地帶卡 )
3 搭建WebService服務器
wsdl是什麼?
wsdl是WebService的規格說明書.
<?xml version ='1.0' encoding ='UTF-8' ?> <definitions name='自定義名稱[可選]' targetNamespace='命名空間[一般為URL]' xmlns:tns='命名空間[值同targetNamespace]' 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/'> <!--<types> 元素定義 web service 使用的數據類型,WSDL 使用 XML Schema 語法來定義數據類型,也可以自定義Schema不包含的類型--> <types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="[值同上tns]"> </xsd:schema> </types> <!-- <message> 元素可定義每個消息的部件,以及相關聯的數據類型. --> <message name='操作名Request'> <part name="term" type="xsd:string"/> </message> <message name='操作名Response'> <part name="value" type="xsd:string"/> </message> <!-- <portType> 元素是最重要的 WSDL 元素.它可描述一個 web service、可被執行的操作,以及相關的消息. 它告訴你去哪個WebService的連接點,扮演了一個控制者. --> <portType name='操作列表名'> <operation name='操作名'> <input message='tns:操作名Request'/> <output message='tns:操作名Response'/> </operation> </portType> <!--<binding> 元素為每個端口定義消息格式和協議細節--> <binding name='WS下的頻道名稱' type='tns:頻道下的操作列表'> <!--style:屬性可取值 "rpc" 或 "document",ransport:屬性定義了要使用的 SOAP 協議.在這個例子中我們使用 HTTP--> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <!--operation 元素定義了每個端口提供的操作符,對於每個操作,相應的 SOAP 行為都需要被定義--> <operation name='test'> <soap:operation soapAction='http://www.cwtservice.cn/newOperation/'/> <input> <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </input> <output> <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </output> </operation> </binding> <!--<service>包含一個或者多個port元素,每個port元素表示一個不同的Web服務--> <service name='WebService名稱[如weatherWS,shopWS]'> <port name='WS下的頻道名稱[如cartSoap,購物車服務]' binding='tns:[頻道名,同左]'> <soap:address location='http://[webservice地址]'/> </port> </service> </definitions>