一,什麼是soap,什麼是wsdl,為什麼要用他們
SOAP是基於XML和HTTP通訊協定,xml各種平台,各種語言都支援的一個種語言。http呢它得到了所有的網際網路瀏覽器及伺服器的支援。
WSDL 指網路服務描述語言 (Web Services Description Language),是一種使用 XML 編寫的文檔。這種文檔可描述某個 Web service。它可規定服務的位置,以及此服務提供的操作。
我是做php的,你是java的,他是做.net,如果我們三個之間要進行通訊,要進行資料交換,怎麼辦呢?我們需要一個能和我們都能通訊的工具。soap,wsdl被創造出來,使得運行在不同的作業系統並使用不同的技術和程式設計語言的應用程式可以互相進行通訊。
二,執行個體
如果php要使用soap的話,通常做法是,添加了一下php的soap模組,在php.ini裡面加上soap.so,下面介紹一個不要添加soap.so檔案,也可以實現soap的方法
nusoap是php寫的一個功能檔案,包涵進來就可以用了,網上很多自己去搜一下吧。
1,不使用wsdl
a,服務端helloworld2.php
<?php<br />//包函nusoap.php<br />require_once('./lib/nusoap.php'); </p><p>//建立服務端<br />$server = new soap_server; </p><p>//定義用戶端調用方法<br />$server->register('hello'); </p><p>//調用方法以及參數<br />function hello($name) {<br /> return 'Hello, ' . $name;<br />} </p><p>$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';<br />$server->service($HTTP_RAW_POST_DATA);<br />?>
b,用戶端hello.php
<?php<br />//包函nusoap.php<br />require_once('./lib/nusoap.php');<br />//建立一個soap用戶端,調用服務端提供的wsdl<br />//$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);<br />$client = new soapclient('http://localhost/test/helloworld2.php');<br />//查看一下是不是報錯<br />$err = $client->getError();<br />if ($err) {<br /> //顯示錯誤<br /> echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';<br />} </p><p>//調用服務端的方法<br />$result = $client->call('hello', array('person' => "this is a test")); </p><p>echo '<h2>Result</h2><pre>';<br />print_r($result);<br />echo '</pre>';<br />?>
2,使用wsdl
a,伺服器端
<?php<br />//包函nusoap.php<br />require_once('./lib/nusoap.php');<br />//建立一個soap服務<br />$server = new soap_server();<br />//初始化支援wsdl<br />$server->configureWSDL('hellowsdl2', 'urn:hellowsdl2');<br />//定義資料結構來接收資料<br />$server->wsdl->addComplexType(<br /> 'Person',<br /> 'complexType',<br /> 'struct',<br /> 'all',<br /> '',<br /> array(<br /> 'firstname' => array('name' => 'firstname', 'type' => 'xsd:string'),//後面的type定義資料的類型,這個是string<br /> 'age' => array('name' => 'age', 'type' => 'xsd:int'),//後面的type定義資料的類型,這個是int<br /> 'gender' => array('name' => 'gender', 'type' => 'xsd:string')//後面的type定義資料的類型,這個是string<br /> )<br />);<br />$server->wsdl->addComplexType(<br /> 'SweepstakesGreeting',<br /> 'complexType',<br /> 'struct',<br /> 'all',<br /> '',<br /> array(<br /> 'greeting' => array('name' => 'greeting', 'type' => 'xsd:string'),<br /> 'winner' => array('name' => 'winner', 'type' => 'xsd:string')<br /> )<br />);<br />//伺服器定義的soap調用方法<br />$server->register('hello', // 方法名字hello,方法就在下面<br /> array('person' => 'tns:Person'), // 用戶端傳來的變數<br /> array('return' => 'tns:SweepstakesGreeting'), //返回參數<br /> 'urn:hellowsdl2', // soap名<br /> 'urn:hellowsdl2#hello', // soap的方法名<br /> 'rpc', // 使用的方式<br /> 'encoded', // 編碼<br /> 'test' // 存檔<br />);<br />//定義上面註冊過的函數hello<br />function hello($person) {<br /> $greeting = 'Hello, ' . $person['firstname'] .<br /> '. It is nice to meet a ' . $person['age'] .<br /> ' year old ' . $person['gender'] . '.'; </p><p> $winner = 'Scott';<br />//要返回的資料<br /> return array(<br /> 'greeting' => $greeting,<br /> 'winner' => $winner<br /> );<br />}<br />// 請求時(試圖)調用服務<br />$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';<br />$server->service($HTTP_RAW_POST_DATA);<br />?>
b,用戶端
<?php<br />//包函nusoap.php<br />require_once('./lib/nusoap.php');<br />//建立一個soap用戶端,調用服務端提供的wsdl<br />//$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);<br />$client = new soapclient('http://localhost/test/helloworld2.php');<br />//查看一下是不是報錯<br />$err = $client->getError();<br />if ($err) {<br /> //顯示錯誤<br /> echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';<br />}<br />//要向服務端要傳的參數<br />$person = array('firstname' => 'Willi', 'age' => 22, 'gender' => 'male'); </p><p>//調用服務端的方法<br />$result = $client->call('hello', array('person' => $person));<br />//錯誤審核<br />if ($client->fault) {<br /> echo '<h2>Fault</h2><pre>';<br /> print_r($result);<br /> echo '</pre>';<br />} else {<br /> $err = $client->getError();<br /> if ($err) {<br /> echo '<h2>Error</h2><pre>' . $err . '</pre>';<br /> } else {<br /> echo '<h2>Result</h2><pre>';<br /> print_r($result);<br /> echo '</pre>';<br /> }<br />}<br />//顯示請求資訊<br />echo '<h2>Request</h2>';<br />echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';<br />//顯示返回資訊<br />echo '<h2>Response</h2>';<br />echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';<br />//顯示調試資訊<br />echo '<h2>Debug</h2>';<br />echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';<br />?>
上面二個例子不管是用戶端,還是伺服器端,都是用php寫的,你可以試著用多種語言來寫,來測試一下。不管你是用php的模組,還是用nusoap,裡面具體方法就不在這多說了,手冊裡面都有。
SOAP在這裡就不用介紹了, 這裡只是簡單的實現一個SOAP的執行個體, 不多說 ,看代碼吧。 soap分為server和client, 我們要使client去調用server的代碼. 首先看server短的代碼:
這個是server端的代碼: server.php
<?php</p><p> //聲明一個函數add() ,並返回它的值<br /> function add($a,$b){<br /> return $a+$b;<br /> }</p><p> //執行個體化一個SoapServer對象, 並將add函數註冊成為其方法<br /> $server = new SoapServer(null,array('uri'=>'http://localhost/')); //指定server端代碼的URI(資源標誌符)<br /> $server->addFunction("add");<br /> $server->handle();<br /> ?>
然後使用client端的代碼來調用server端的代碼: client的代碼也很簡單: 如下:
這個是client端的代碼 client.php
<?php</p><p> //建立一個參數數組,儲存要訪問的提供soap服務的電腦的地址與程式<br /> $arrOptions=array(<br /> 'uri'=>'http://localhost/',<br /> 'location'=>'http://localhost/soap/server.php', //注意: 這個location指定的是server端代碼在伺服器中的具體位置, 我的是在本地根目錄下的soap目錄中,<br /> 'trace'=>true,<br /> );<br /> $soapObject = new SoapClient(null,$arrOptions); //執行個體化用戶端對象<br /> echo $soapObject->add(20,30); //調用伺服器端的函數add並傳回值50<br /> ?>
ok, 結束了 !