許多機構已經采用了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>
";
$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>
";
?>
為了在一個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