PHP SOAP伺服器
用PHP和NuSoap來建立SOAP伺服器非常容易。基本上,你只要寫出你想要暴露給你的Web services的函數,然後用NuSoap去註冊它們就可以了。OK,另外還需要兩步才能完成PHP SOAP伺服器的建立。首先你還要在你的PHP代碼中建立NuSoap對象的一個執行個體,然後用HTTP POST方法將未經處理資料傳給NuSoap進行處理
NuSOAP的使用比較簡單,其中最常用到的類是soap_server和soapclient,其中soap_server用於建立 Webservice服務,類soapclient則用於調用Webservice.這兩個類的定義都在lib/nusoap.php中,因此我們在建立 或調用Webservice介面程式時均需要引用該檔案.
NuSoap是PHP環境下的WebService編程工具,用於建立或調用WebService。它是一個開源軟體,是完全採用PHP語言編寫的、通過HTTP收發SOAP訊息的一系列PHP類,由NuSphere Corporation(http://dietrich.ganx4.com/nusoap/ )開發。NuSOAP的一個優勢是不需要擴充庫的支援,這種特性使得NuSoap可以用於所有的PHP環境,不受伺服器安全設定的影響。
1.首先,去http://sourceforge.net/projects/nusoap/下載nusoap.zip。
2.服務端:建立nusoapService.php檔案。
[php]view plaincopy
- require_once ("lib/nusoap.php");
- $server = new soap_server ();
- // 避免亂碼
- $server->soap_defencoding = 'UTF-8';
- $server->decode_utf8 = false;
- $server->xml_encoding = 'UTF-8';
- $server->configureWSDL ('test'); // 開啟 wsdl 支援
- /*
- 註冊需要被用戶端訪問的程式
- 類型對應值: bool->"xsd:boolean" string->"xsd:string"
- int->"xsd:int" float->"xsd:float"
- */
- $server->register ( 'GetTestStr', // 方法名
- array ("name" => "xsd:string" ), // 參數,預設為 "xsd:string"
- array ("return" => "xsd:string" ) ); // 返回值,預設為 "xsd:string"
- //isset 檢測變數是否設定
- $HTTP_RAW_POST_DATA = isset ( $HTTP_RAW_POST_DATA ) ? $HTTP_RAW_POST_DATA : '';
- //service 處理用戶端輸入的資料
- $server->service ( $HTTP_RAW_POST_DATA );
- /**
- * 供調用的方法
- * @param $name
- */
- function GetTestStr($name) {
- return "Hello, { $name } !";
- }
- ?>
3.用戶端:建立nusoapClient.php檔案。
[php]view plaincopy
- require_once ("lib/nusoap.php");
- /*
- 通過 WSDL 調用 WebService
- 參數 1 WSDL 檔案的地址 (問號後的wsdl不能為大寫)
- 參數 2 指定是否使用 WSDL
- $client = new soapclient('http://localhost/nusoapService.php?wsdl',true);
- */
- $client = new soapclient ( 'http://localhost/nusoapService.php' );
- $client->soap_defencoding = 'UTF-8';
- $client->decode_utf8 = false;
- $client->xml_encoding = 'UTF-8';
- // 參數轉為數組形式傳遞
- $paras = array ('name' => 'Bruce Lee' );
- // 目標方法沒有參數時,可省略後面的參數
- $result = $client->call ( 'GetTestStr', $paras );
- // 檢查錯誤,擷取返回值
- if (! $err = $client->getError ()) {
- echo " 返回結果: ", $result;
- } else {
- echo " 調用出錯: ", $err;
- }
- ?>
[php]view plaincopy
- require_once ("lib/nusoap.php");
- /*
- 通過 WSDL 調用 WebService
- 參數 1 WSDL 檔案的地址 ( 問號後的 wsdl 不能為大寫 )
- 參數 2 指定是否使用 WSDL
- $client = new soapclient('http://localhost/nusoapService.php?wsdl',true);
- */
- $client = new soapclient ( 'http://localhost/nusoapService.php?wsdl',true);
- $client->soap_defencoding = 'UTF-8';
- $client->decode_utf8 = false;
- $client->xml_encoding = 'UTF-8';
- // 參數轉為數組形式傳遞
- $paras = array ('name' => 'Bruce Lee' );
- // 目標方法沒有參數時,可省略後面的參數
- $client->call ( 'GetTestStr', $paras );
- $document = $client->document;
- echo $document;
- ?>
註:返回結果: Hello, { Bruce Lee } !
WSDL
WSDL是一種用於描述Web Service的XML語言。它是一種機讀格式,把所有的訪問服務所必須的資訊提供給Web Service用戶端。NuSOAP專門提供一個類進行WDSL檔案的解析,並且從中提取資訊。soapclient對象使用wsdl類來減輕開發人員調用服務的難度。通過WSDL資訊的協助來建立報文,程式員僅僅需要知道操作的名字和參數就能調用它。
通過NuSOAP使用WSDL提供以下幾點優點:
所有的服務元檔案,如命名空間(namespaces),endpoint URLs,參數名(parameter names)等等都可以直接從WSDL檔案獲得,這樣就允許用戶端動態適應伺服器端的變化。因為從伺服器隨時可以獲得,所以這些資料不再需要在使用者指令碼中使用硬性編碼。
它允許我們使用soap_proxy類。這個類派生自soapclient類,增加了WDSL檔案中詳細列出的操作所對應的方法。現在使用者通過它可以直接調用這些方法。
soapclient 類包含一個getProxy()方 法,它返回一個soap_proxy類的一個對象。soap_proxy類派生自soapclient類,增加了對應於 WSDL文檔中定義的操作的方法, 並且允許使用者調用一個endpoint的遠程方法。這僅僅適用於soapclient對象用WDSL檔案初始化的情況。優點是易於使用者使用,缺點是效能--PHP中建立對象是耗時的--且不為功利目的服務 (and this functionality serves no utilitarian purpose)。
[php]view plaincopy
- require_once ("lib/nusoap.php");
- $client = new soapclient ( 'http://localhost/nusoapService.php?wsdl',true);
- $client->soap_defencoding = 'UTF-8';
- $client->decode_utf8 = false;
- $client->xml_encoding = 'UTF-8';
- //產生proxy類
- $proxy = $client->getProxy();
- //調用遠程函數
- $sq = $proxy->GetTestStr('Bruce Lee');
- if (!$err=$proxy->getError()) {
- print_r($sq);
- } else {
- print "ERROR: $err";
- }
-
- print 'REQUEST:<xmp>'.$p->request.'</xmp>';
- print 'RESPONSE:<xmp>'.str_replace('><', ">\n<", $p->response).'</xmp>';
- ?>
第四步:運行server端檔案頁面:http://localhost/nusoapService.php產生的wsdl檔案
點擊方法名稱。這樣我們通過在service中增加了幾行代碼我們就通過使用NuSOAP為service提供了一個可視化的文檔。但是,這還不是所有我們能做的。
我們在service中通過使用NuSOAP增加一些WSDL的調用我們可以為service產生WSDL還有一些其他的文檔。與此不同的是,在 client中我們能做的就有些少了,至少在我們的這個簡單的例子中是這樣。下面所示的這個client跟沒有使用WSDL的client沒有什麼不同 的,唯一的不同就是解析soapclent class是通過提供WSDL的URL來完成的,而不是之前的通過service endpoint。
NuSoap調用WebService出現亂碼的解決方案:
[php]view plaincopy
- $client->soap_defencoding = 'utf-8';
- $client->decode_utf8 = false;
- $client->xml_encoding = 'utf-8';
檔案代碼不能有任何輸出,否則調用時會報類似如下錯誤:
XML error parsing SOAP payload on line x(行號): Reserved XML Name
用nusoap實現WebService,不要開啟php的SOAP擴充,原因是nusoap的SoapClient類和php5內建的SOAP類有衝突。
解決方案
1. 修改php.ini不載入php5內建的soap擴充(windows下是php_soap.dll)。
2. 也有給nusoap的SoapClient類改名的。
身份認證
[php]view plaincopy
- header('content-type: text/xml; charset=UTF-8');
- require_once('nusoap.php');
- $params = array('AuthenticationHeader' => array(
- 'Content-Type' => 'text/xml; charset=UTF-8',
- 'SOAPAction' => 'YourFunstion',
- )
- );
- $client = new nusoap_client('http://www.yourdomain.com/service.asmx?wsdl', true, '', '', '', '');
- $client->setHeaders('
- "http://tempuri.org/webservice">
- username
- password
-
- ');
- $err = $client->getError();
- if ($err) {
- echo '
Constructor error
' . $err . '
';
- }
- $result = $client->call('YourFunction', $params, '', '', false, true);
- if ($client->fault) {
- echo '
Fault
';
- print_r($result);
- echo '';
- } else {
- $err = $client->getError();
- if ($err) {
- echo '
Error
' . $err . '
';
- } else {
- echo '
Result
';
- //print_r($result);
- echo '';
- }
- }
- echo '
Request
' . htmlspecialchars($client->request, ENT_QUOTES) . '
';
- echo '
Response
' . htmlspecialchars($client->response, ENT_QUOTES) . '
';
- ?>
以上就介紹了webservice——nusoap詳解,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。