許多機構已經採用了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函數的值。
要運行這個例子,只要簡單的在Web瀏覽器中輸入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