webservice——nusoap詳解

來源:互聯網
上載者:User
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

  1. require_once ("lib/nusoap.php");
  2. $server = new soap_server ();
  3. // 避免亂碼
  4. $server->soap_defencoding = 'UTF-8';
  5. $server->decode_utf8 = false;
  6. $server->xml_encoding = 'UTF-8';
  7. $server->configureWSDL ('test'); // 開啟 wsdl 支援
  8. /*
  9. 註冊需要被用戶端訪問的程式
  10. 類型對應值: bool->"xsd:boolean" string->"xsd:string"
  11. int->"xsd:int" float->"xsd:float"
  12. */
  13. $server->register ( 'GetTestStr', // 方法名
  14. array ("name" => "xsd:string" ), // 參數,預設為 "xsd:string"
  15. array ("return" => "xsd:string" ) ); // 返回值,預設為 "xsd:string"
  16. //isset 檢測變數是否設定
  17. $HTTP_RAW_POST_DATA = isset ( $HTTP_RAW_POST_DATA ) ? $HTTP_RAW_POST_DATA : '';
  18. //service 處理用戶端輸入的資料
  19. $server->service ( $HTTP_RAW_POST_DATA );
  20. /**
  21. * 供調用的方法
  22. * @param $name
  23. */
  24. function GetTestStr($name) {
  25. return "Hello, { $name } !";
  26. }
  27. ?>



3.用戶端:建立nusoapClient.php檔案。


[php]view plaincopy

  1. require_once ("lib/nusoap.php");
  2. /*
  3. 通過 WSDL 調用 WebService
  4. 參數 1 WSDL 檔案的地址 (問號後的wsdl不能為大寫)
  5. 參數 2 指定是否使用 WSDL
  6. $client = new soapclient('http://localhost/nusoapService.php?wsdl',true);
  7. */
  8. $client = new soapclient ( 'http://localhost/nusoapService.php' );
  9. $client->soap_defencoding = 'UTF-8';
  10. $client->decode_utf8 = false;
  11. $client->xml_encoding = 'UTF-8';
  12. // 參數轉為數組形式傳遞
  13. $paras = array ('name' => 'Bruce Lee' );
  14. // 目標方法沒有參數時,可省略後面的參數
  15. $result = $client->call ( 'GetTestStr', $paras );
  16. // 檢查錯誤,擷取返回值
  17. if (! $err = $client->getError ()) {
  18. echo " 返回結果: ", $result;
  19. } else {
  20. echo " 調用出錯: ", $err;
  21. }
  22. ?>


[php]view plaincopy

  1. require_once ("lib/nusoap.php");
  2. /*
  3. 通過 WSDL 調用 WebService
  4. 參數 1 WSDL 檔案的地址 ( 問號後的 wsdl 不能為大寫 )
  5. 參數 2 指定是否使用 WSDL
  6. $client = new soapclient('http://localhost/nusoapService.php?wsdl',true);
  7. */
  8. $client = new soapclient ( 'http://localhost/nusoapService.php?wsdl',true);
  9. $client->soap_defencoding = 'UTF-8';
  10. $client->decode_utf8 = false;
  11. $client->xml_encoding = 'UTF-8';
  12. // 參數轉為數組形式傳遞
  13. $paras = array ('name' => 'Bruce Lee' );
  14. // 目標方法沒有參數時,可省略後面的參數
  15. $client->call ( 'GetTestStr', $paras );
  16. $document = $client->document;
  17. echo $document;
  18. ?>


註:返回結果: 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

  1. require_once ("lib/nusoap.php");
  2. $client = new soapclient ( 'http://localhost/nusoapService.php?wsdl',true);
  3. $client->soap_defencoding = 'UTF-8';
  4. $client->decode_utf8 = false;
  5. $client->xml_encoding = 'UTF-8';
  6. //產生proxy類
  7. $proxy = $client->getProxy();
  8. //調用遠程函數
  9. $sq = $proxy->GetTestStr('Bruce Lee');
  10. if (!$err=$proxy->getError()) {
  11. print_r($sq);
  12. } else {
  13. print "ERROR: $err";
  14. }
  15. print 'REQUEST:<xmp>'.$p->request.'</xmp>';
  16. print 'RESPONSE:<xmp>'.str_replace('><', ">\n<", $p->response).'</xmp>';
  17. ?>


第四步:運行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

  1. $client->soap_defencoding = 'utf-8';
  2. $client->decode_utf8 = false;
  3. $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

  1. header('content-type: text/xml; charset=UTF-8');
  2. require_once('nusoap.php');
  3. $params = array('AuthenticationHeader' => array(
  4. 'Content-Type' => 'text/xml; charset=UTF-8',
  5. 'SOAPAction' => 'YourFunstion',
  6. )
  7. );
  8. $client = new nusoap_client('http://www.yourdomain.com/service.asmx?wsdl', true, '', '', '', '');
  9. $client->setHeaders('
  10. "http://tempuri.org/webservice">
  11. username
  12. password
  13. ');
  14. $err = $client->getError();
  15. if ($err) {
  16. echo '

    Constructor error

    ' . $err . '
    ';
  17. }
  18. $result = $client->call('YourFunction', $params, '', '', false, true);
  19. if ($client->fault) {
  20. echo '

    Fault

    ';  
  21. print_r($result);
  22. echo '';
  23. } else {
  24. $err = $client->getError();
  25. if ($err) {
  26. echo '

    Error

    ' . $err . '
    ';
  27. } else {
  28. echo '

    Result

    ';  
  29. //print_r($result);
  30. echo '';
  31. }
  32. }
  33. echo '

    Request

    ' . htmlspecialchars($client->request, ENT_QUOTES) . '
    ';
  34. echo '

    Response

    ' . htmlspecialchars($client->response, ENT_QUOTES) . '
    ';
  35. ?>

以上就介紹了webservice——nusoap詳解,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.