許多機構已經採用了Apach和PHP作為他們的Web應用環境。在Web services模式中採用PHP可能看上去可能會比較難。但事實上,搭配NuSoap,你可以輕鬆的應用PHP建構SOAP的客戶端和伺服器端。
為了說明如何應用NuSoap和PHP來建構Web services,我們將舉一個簡單的例子。這個範例應用程式由一個PHP Web services的伺服器端和客戶端組成。他將實現兩個功能:顛倒一個字串字元的順序,求兩個數的和。
PHP SOAP伺服器用PHP和NuSoap建立SOAP伺服器非常容易。基本上,你只要寫出你想要暴露給你的Web services的函數,然後用NuSoap去註冊它們就可以了。
OK,另外還需要兩步驟才能完成PHP SOAP伺服器的建立。首先你也要在你的PHP程式碼中建立NuSoap物件的一個實例,然後用HTTP POST方法將原始資料傳給NuSoap處理。聽起來簡單吧。先看看清單1。
清單1:soapfunc.php
<?
require_once('nusoap.php');
function reverse($str){
$retval = "";
if(strlen($str) < 1) {
return new soap_fault('Client','','Invalid string');
}
for ($i = 1; $i <= strlen($str); $i++) {
$retval .= $str[(strlen($str) - $i)];
}
return $retval;
}
function add2numbers($num1, $num2) {
if (trim($num1) != intval($num1)) {
return new soap_fault('Client', '', 'The first number is invalid');
}
if (trim($num2) != intval($num2)) {
return new soap_fault('Client', '', 'The second number is invalid');
}
return ($num1 + $num2);
}
?>
清單1給了soapfunc.php的來源檔。這個檔案包含了我們想要透過SOAP協定暴露給Web services的兩個函數:reverse和add2numbers,它們是我們這個Web services 應用的核心。函數reverse帶一個參數,顛倒字串中的字元的順序,然後回傳。
清單2:soapserver.php
<?
require_once('nusoap.php');
include('soapfunc.php');
$soap = new soap_server;
$soap->register('reverse');
$soap->register('add2numbers');
$soap->service($HTTP_RAW_POST_DATA);
?>
清單2舉例說明了NuSoap註冊函數和呼叫SOAP處理程序的用法。你看到了,註冊你的兩個函數(在soapfunc.php中)、傳遞POST資料給soap_server對象,就跟創建一個新的soap_server對象實例一樣的簡單。 soap_server物件將要檢查POST資料並確定要呼叫哪個函數,然後傳遞參數給這個PHP函數。從PHP函數傳回的資料被重新包裝為SOAP回應並傳送給請求服務的SOAP客戶端。
PHP SOAP客戶端現在我們已經利用NuSoap和PHP創建了一個SOAP伺服器,我們需要對它進行測試。就像我們建立SOAP伺服器程式一樣,我們可以在PHP中利用NuSoap再建立一個SOAP的客戶端程式。清單3給出了PHP SOAP客戶端程式的來源程式。
現在我們已經利用NuSoap和PHP創建了一個SOAP伺服器,我們需要對它進行測試。就像我們建立SOAP伺服器程式一樣,我們可以在PHP中利用NuSoap再建立一個SOAP的客戶端程式。清單3給出了PHP SOAP客戶端程式的來源程式。
清單3:soapclient.php
<?
include('nusoap.php');
$client = new soapclient('http://localhost/soapserver.php');
$str = "This string will be reversed";
$params1 = array('str'=>$str);
$reversed = $client->call('reverse',$params1);
echo "If you reverse '$str', you get '$reversed'<br>n";
$n1 = 5;
$n2 = 14;
$params2 = array('num1'=>$n1, 'num2'=>$n2);
$added = $client->call('add2numbers', $params2);
echo "If you add $n1 and $n2 you get $added<br>n";
?>
為了在一個SOAP伺服器上能使用PHP客戶端程序,你還得做三件事情。第一,你要建立一個soapclient物件。 soapclient 物件負責處理參數的編組和SOAP協定。 soapclient需要一個必須是URL的參數。這個URL可以指向一個實際SOAP伺服器的HTTP終端或一個WSDL描述。在我們這個例子裡,它是指向我們的PHP SOAP伺服器的一個URL。
當呼叫需要參數的函數時,你需要先建立一個參數數組,數組包括一組鍵-值(key-value)對。鍵(key)是參數的名字,值(value)是參數的值。
當需要呼叫函數時,你就用soapclient物件去調用,並且傳入兩個參數。第一個參數是你要呼叫的函數的名字,第二個參數是包含SOAP函數所帶參數的一個數組,主調函數將會傳回你所呼叫的SOAP函數的值。
要執行這個例子,只要簡單的在網頁瀏覽器中輸入soapclient.php的URL。你將類似以下的輸出:
If you reverse 'This string will be reversed', you get 'desrever eb lliw gnirts sihT' If you add 5 and 14 you get 19