wsdl實例
<?xml version ='1.0' encoding ='UTF-8' ?> <definitions targetNamespace='http://localhost/00/' xmlns:tns='http://localhost/00/' 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="http://localhost/00/"> </xsd:schema> </types> <!-- <message> 元素可定義每個消息的部件,以及相關聯的數據類型. --> <message name='testRequest'> <part name="term" type="xsd:string"/> </message> <message name='testResponse'> <part name="value" type="xsd:string"/> </message> <!-- <portType> 元素是最重要的 WSDL 元素.它可描述一個 web service、可被執行的操作,以及相關的消息. 它告訴你去哪個WebService的連接點,扮演了一個控制者. --> <portType name='oplist'> <operation name='test'> <input message='tns:testRequest'/> <output message='tns:testResponse'/> </operation> </portType> <!--<binding> 元素為每個端口定義消息格式和協議細節--> <binding name='cartSoap' type='tns:oplist'> <!--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='shopWS'> <port name='cartSoap' binding='tns:cartSoap'> <soap:address location='http://localhost/00/wss.php'/> </port> </service> </definitions>
Server端示例:
function test($x) { return $x; } $ss = new SoapServer('http://localhost/00/wsdl.xml'); $ss->addFunction('test'); $ss->handle();
Client調用:
$soap = new soapClient('http://localhost/00/wsdl.xml',array('trace'=>true)); var_dump($soap->test('10086'));
傳遞和返回數組參數
如果傳遞或返回的參數為數組,可以在message標簽中做說明.
<message name='testRequest'> <part name="term" type="xsd:ArrayOfString"/> </message> <message name='testResponse'> <part name="value" type="xsd:ArrayOfString"/> </message>
XML-RPC調用
XML-RPC可以理解為簡化版的soap,對數據的包裝相對簡潔. php.ini中,要打開extension=php_xmlrpc.dll
/* 求和函數 注意,rpc服務器在調用函數時,傳的參數是這樣的: array(0=>'函數名' , 1=>array(實參1,實參2,...實參N) , 2=>NULL) */ function hello() { return 'hello'; } function sum($method , $args , $extra) { return array_sum($args); } // 創建RPC Server $server = xmlrpc_server_create (); xmlrpc_server_register_method ($server , 'hello' , 'hello'); xmlrpc_server_register_method ($server , 'sum' , 'sum'); // 收取請求 $request = $HTTP_RAW_POST_DATA; //執行調用客戶端的XML請求後獲取執行結果 $xmlrpc_response = xmlrpc_server_call_method($server, $request , null); //把函數處理後的結果XML進行輸出 header('Content-Type: text/xml'); echo $xmlrpc_response; //銷毀XML-RPC服務器端資源 xmlrpc_server_destroy($server);
客戶端:
class rpcclient { protected $url; public function __construct($url='' ) { $this->url = $url; } protected function query($request) { $context = stream_context_create(array('http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml", 'content' => $request ))); $xml = file_get_contents($this->url, false, $context); return xmlrpc_decode($xml); } public function __call($method , $args) { $request = xmlrpc_encode_request($method , $args); return $this->query($request); } } $rpc = new rpcclient('http://localhost/00/rpcs.php'); var_dump($rpc->hello()); var_dump($rpc->sum(4,5,6));
WebService與json Api的區別
WebService json API
數據封裝 XML json
復雜度 高 低
底層協議 不限 HTTP
數據類型 可嚴格定義 不可嚴格定義
自說明 性自說明 需額外API文檔