NuSOAP webservice接口使用詳解

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
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
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
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
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出現亂碼的解決方法:

$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
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('  
<tns:AuthenticationHeader xmlns:tns="http://tempuri.org/webservice">
  <tns:UserName>username</tns:UserName> 
  <tns:Password>password</tns:Password>   
 </tns:AuthenticationHeader>
');
$err = $client->getError();
if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
$result = $client->call('YourFunction', $params, '', '', false, true);
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    $err = $client->getError();
    if ($err) {
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        echo '<h2>Result</h2><pre>';
//print_r($result);
        echo '</pre>';
    }
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
?>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章