Web Services 學習筆記
許多機構已經採用了Apach和PHP作為他們的Web應用環境。在Web services模式中採用PHP可能看上去可能會比較難。但是事實上,你可以輕鬆的應用PHP5.0構建SOAP的用戶端和伺服器端。
什麼是 PHP? PHP:Hypertext Preprocessor(超文本前置處理器,PHP)是一種流行的伺服器端指令碼語言,用於建立動態 Web 內容。PHP 解譯器為主流平台提供了原始碼或者編譯好的二進位檔案,這些平台包括大多數 Linux? 版本、Windows?、Mac OS X 和 iSeries?。
確實有數百萬台 Web 服務器正在運行 PHP,其中大部分使用的是 PHP 4。2004 年 7 月推出的 PHP 5 正在逐漸被採用。PHP 5 改進了物件模型,底層的記憶體管理也從多線程和效能的角度重新作了設計。但是需要注意少數無法向後相容的修改,PHP 手冊中對這些進行了記錄。
什麼是 Web 服務技術? Web 服務指的是自成體系的、模組化的應用程式,客戶機和服務在這種應用程式中是松耦合的。關於 Web 服務的詳細資料,對於本文來說,您只需要瞭解其中的主要技術:
SOAP(簡易物件存取通訊協定 (SOAP))定義了客戶機與伺服器之間傳遞的訊息。訊息採用 XML 格式。SOAP 獨立於平台、程式設計語言、網路和傳輸層。本文將討論 HTTP 上的 SOAP。
WSDL(Web 服務描述語言)是用於描述 Web 服務的基於 XML 的語言,描述內容包括服務的位置、格式、操作、參數和資料類型。
UDDI(統一描述、發現和整合)是用 API 和 UDDI Registry 實現來提供在網路上儲存和檢索 Web 服務資訊的方法。
本文包括 SOAP 訊息和 WSDL 文檔的一些例子,但沒有提供 UDDI 的例子。
XMethods 網站是一個有用的 Web 服務工具,在那裡可以找到在各種伺服器平台上實現的可公開使用的 Web 服務的列表。可以使用本文中的例子很方便地訪問從 XMethods 中選擇的服務
SOAP 和 PHP 有多種產品允許在 PHP 4 指令碼中使用 SOAP,最常見的產品是 PEAR::SOAP 和 NuSOAP。在寫這篇文章的時候,這些產品在與 PHP 5 的相容方面還存在問題,估計很快就會升級。
PHP 5 中新增了內建的 SOAP 延伸模組,我們稱之為 ext/soap。它是作為 PHP 的一部分提供的,因此不需要下載、安裝和管理單獨的包。這是第一個用 C 而不是 PHP 為 PHP 編寫的 SOAP 實現,因此作者聲稱它的速度要快得多。
因為新的擴充是 PHP 的完整組成部分之一,相關文檔包含在 PHP 手冊的 Function Reference 部分。SOAP 參考是以一個重要的免責聲明開始的:
警告:該擴充是實驗性的(EXPERIMENTAL)。本擴充的行為,包括關於本擴充的函數名和其他內容,在以後的 PHP 版本中隨時可能改變,不另行通知。使用該擴充的風險自負。
警告看起來有點讓人擔心,但實際上這個擴充似乎得到了很好的支援。和任何新代碼一樣,該擴充也存在缺陷,但是報告的問題通常很快就能得到修正。在 PHP 網站上可以看到缺陷列表。我們估計,在將來的 PHP 版本中,該擴充將從實驗性功能轉為主流功能。
安裝 PHP SOAP 延伸模組
在 Windows 上,只要在;extension=php_zip.dll這行後面增加extension=php_soap.dll 這樣一行就行了
最後,ext/soap 在 php.ini 中有自己的配置部分,在完成配置之後,ext/soap 如下所示:
[soap]
; Enables or disables WSDL caching feature.
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
soap.wsdl_cache_dir="D:/WEB/php/soap_temp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
soap.wsdl_cache_ttl=86400
一個例子便能說明一切,讓我們先看一個例子為了說明如何應用PHP5.0來構建Web services,我們將舉一個簡單的例子。這個例子應用程式由一個PHP Web services的伺服器端和用戶端組成。他將實現兩個功能:顛倒一個字串字元的順序,求兩個數的和
PHP SOAP伺服器用PHP5.0來建立SOAP伺服器非常容易。基本上,你只要寫出你想要暴露給你的Web services的函數,然後去註冊它們就可以了。
OK,另外還需要兩步才能完成PHP SOAP伺服器的建立。首先你還要在你的PHP代碼中建立Soap對象的一個執行個體,然後用HTTP POST方法將未經處理資料傳給Soap進行處理。聽起來簡單吧。
先看看清單1
soapfunc.php
//soapfunc.php
function reverse($str){
$retval = "";
if(strlen($str) < 1) {
return new SoapFault(''Client'','''',''Invalid string''); // it is possible to use PHP exception mechanism to throw SOAP Fault
}
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 SoapFault(''Client'', '''', ''The first number is invalid'');
}
if (trim($num2) != intval($num2)) {
return new SoapFault(''Client'', '''', ''The second number is invalid'');
}
return ($num1 + $num2);
}
?>
清 單1給出了soapfunc.php的源檔案。這個檔案包含了我們想通過SOAP協議暴露給Web services的兩個函數:reverse和add2numbers,它們是我們這個Web services 應用的核心。函數reverse帶一個參數,顛倒字串中的字元的順序,然後返回
清單2:soapserver.php
//soapserver.php
include_once(''soapfunc.php'');
$server = new SoapServer(null, array(''uri'' => "http://test-uri/"));//the creation of SoapServer objects in WSDL or non-WSDL mode
$server->addFunction(''reverse'');//Exports one or more functions for remote clients
$server->addFunction(''add2numbers'');//Exports one or more functions for remote clients
$server->handle();//Processes a soap request, calls necessary functions, and sends a response back. The soap request. If this argument is omitted, the req