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/ 2.服務端:建立
nusoapService.php檔案。
[php]
view plaincopy
-
require_once ("lib/nuso.php" = new
- soap_server (); // 避免亂碼
- $server
- $server->decode_utf8 = false; $server->xml_encoding =
- 'UTF-8'; ('test');
- // 開啟 wsdl 支援 /**
- /*已註冊 bool->"xsd:boolean" string- >"xsd:string" int->"xsd:int" float->"xsd:float"
- $server
-> register ( - 'GetTestStr',
// 法名-
- "xsd:string" ), // 參數,預設為 "xsd:string"
- array (return"); // 回傳值,預設為 "xsd:string"
-
//isset 偵測變數是否設定 _c isset ( $HTTP_RAW_POST_DATA ) ? $HTTP_RAW_POST_DATA : '';
- //service 處理客戶端輸入的資料5> ( $HTTP_RAW_POST_DATA ); /**
- * 供呼叫的方法
* @param $name-
* @param $name*/ function)$ return
- "Hello, { $ name } !";
} -
?> . 客戶端:建立nusoapClient.php檔案。
- [php]
view plaincopy
- require_once (
- 透過 WSDL 呼叫 WebService
- 參數 1 WSDL 檔案的位址 (問號後的wsdl不能為大寫) WS
- 參數soapclient('http://localhost/ nusoapService.php?wsdl',true);
- */
-
$cli; 'http://localhost/nusoapService.php '
- ); $client
- ->soap_defencoding = 'UTF-8'; ->decode_utf8 = false; $client->xml_encoding = 'UTF-8'
- ; ///
$paras- = array (
'name'- => 'Bruce Lee' );
$result - = $client->call (
'GetTestStr'- , 檢查錯誤,取得回傳值 if (! $err =
$client- ->getError ()) " 回傳結果: ",
$result- ; } else { , $err;
- }
? > - [php]
view plaincopy
- require_once (
- 透過 WSDL 呼叫 WebService
- 參數 1 WSDL 檔案的位址 ( 問號後的 wsdl 無法為大寫 )
= new soapclient('http://localhost/ nusoapService.php?wsdl',true);-
*/-
- $cli; 'http://localhost/nusoapService.php ?wsdl'
,true); - $client
->soap_defencoding = - 'UTF-8'clicli; ent->decode_utf8 = false; $client->xml_encoding = 'UTF-8'
; -
$paras = array (
- 'name' => 'Bruce Lee' );
- $client->call ( 'GetTestStr'
, - $paras); $client
->document; - echo $document; ?>
-
?> 回傳結果: Hello, { Bruce
Lee } !
- WSDLWSDL是一種用來描述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/nuso.php" = new
- soapclient ( 'http://localhost/nusoapService.php?wsdl',true); $client->so
$ client-
->decode_utf8 = false; ->decode_utf8 = false; $client->xml_encoding =Fk
- //生成proxy類
- $proxy = $client->getProxy();
$sq- = $proxy- >GetTestStr(
'Bruce Lee'-
); if (!)$
- if (! {
print_r (- $sq); } else { ER
- } print 'REQUEST:<xmp>'.$p
->request.- '</xmp>' <xmp>'. str_replace
(-
'>, ">n
, -
$ ?>
第四步:執行server端檔案頁面:http://localhost/-
nusoapService
-
.php產生的檔案檔案
點擊方法名稱。這樣我們透過在service中增加了幾行程式碼我們就透過使用NuSOAP為service提供了一個可視化的文檔。但是,這還不是所有我們能做的。
-
我們在service中透過使用NuSOAPserviceWSDL的呼叫我們可以為其他產生的文件呼叫。與此不同的是,在 client中我們能做的就有些少了,至少在我們的這個簡單的例子中是如此。下面所示的這個client跟沒有使用WSDL的client沒有什麼不同 的,唯一的不同就是解析soapclent class是透過提供WSDL的URL來完成的,而不是之前的透過service endpoint。 NuSoap呼叫WebService出現亂碼的解決方法:[php]
view plaincopy$client
- ->soap_defencoding = 'utf-8'
; ->decode_utf8 = false;
$client ->xml_encoding = 'utf-8'; ![](http://image.codes51.com/Article/image/20150829/20150829104443_9733.jpg)
否則呼叫時會報類似如下錯誤:
XML error parsing SOAP payload on line x(行號): Reserved XML Name
實作
WebService,
不要開啟
php
的
SOAP
- 擴充,原因是nusoap的SoapClient類別和php5內建的SOAP類別有衝突。 解決方案1. 修改php.ini不載入php5內建的soap擴充(windows下是php_soap.dll)。 2. 也有為nusoap的SoapClient類別改名的。
- 身份認證
-
view plaincopy
- header('內容類型:text/xml; charset=UTF-8');
- ); ' );
$params- = array('AuthenticationHeader' '內容類型' => 'text/ xml; 字元集=UTF-8',
-
'SOAPAction' < ) );
- $client = new nusoap_client(
'http://www.yourdomain.com/service.asmx?wsdl'-
, truetrue,"h ,
- '',
- ''); $client ader xmlns:tns="http://tempuri .org/webservice"> 使用者名稱使用者名稱> tns:AuthenticationHeader> '); $err =
if- ($err) {
- echo
'建構子錯誤< ;/h2>'
- '
建構子錯誤< ;/h2>'
'建構子錯誤< ;/h2>'
- '
構造函數錯誤< ;/h2>'
. - ''
;
- } $ ', $ params
- , '', '',假,真);
- { echo '
F ault
'
-
迴聲- ' pre>'; } else { ->getError(); if (
$err-
) { echo><'錯誤。
- $錯誤。 '';
} - else '
結果
; '
- ; //print_r($結果);
-
}
- }
-
echo '
Request
'
. htmlspecialchars(.clicliUg ' ; echo
- '
Response
'
. OTES) . ''; ?>
以上就介紹了webservice——nusoap詳解,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。 -