首頁 後端開發 php教程 PHP使用SOAP擴充實作WebService的方法

PHP使用SOAP擴充實作WebService的方法

Jan 24, 2017 am 10:06 AM

本文實例講述了PHP使用SOAP擴充實作WebService的方法。分享給大家供大家參考,具體如下:

最近在一個PHP專案中對接外部介面涉及到WebService,搜尋引擎上相關文章不是很多,找到的大都是引用一個號稱很強大的開源軟體NuSOAP(下載地址: http://sourceforge.net/projects/nusoap/),即一些類別。文章寫描述的環境是PHP 4.3,現在都流行PHP 5.2或PHP 5.3了。先拿來試試,運行出錯,原來NuSOAP提供的soapclient類別與PHP 5中新增了內建的SOAP擴充的SoapClient類別衝突了。

雖然NuSOAP號稱可以用於所有的PHP 環境,不受伺服器安全設定的影響。但要引用一大堆類文件,還是覺得用PHP 5新增了內建的SOAP擴充好一些,能實現實用就好。先了解SOAP:

一、SOAP和XML-PRC比較

在Web服務發展的初期,XML格式化訊息的第一個主要用途是,應用於XML-RPC協議,其中RPC代表遠端過程呼叫。在XML遠端過程呼叫(XML-RPC)中,用戶端傳送一條特定訊息,該訊息中必須包含名稱、執行服務的程式以及輸入參數。

XML-RPC只能使用有限的資料型態種類和一些簡單的資料結構。人們認為這個協定還不夠強大,於是就出現了SOAP——其最初的定義是簡單物件存取協定。之後,大家逐漸意識到SOAP其實並不簡單,也不需要必須使用物件導向語言,所以,現在人們只是沿用SOAP這個名稱而已。

XML-RPC只有簡單的資料類型集,取而代之,SOAP是透過利用XML Schema的不斷發展來定義資料類型的。同時,SOAP也能夠利用XML 命名空間,這是XML-RPC所不需要的。如此一來,SOAP訊息的開頭部分就可以是任何類型的XML命名空間聲明,其代價是在系統之間增加了更多的複雜性和不相容性。

隨著電腦產業的覺醒,人們發現了基於XML的Web服務的商業潛力,於是,各家公司開始不斷地發掘想法、觀點、論點以及標準化嘗試。 W3C曾經設法以「Web服務活動」的名義來組織成果展,其中也包括實際做出SOAP的XML協定工作小組(XML Protocol Working Group)。與Web服務有關的標準化成果(從某種程度上說與SOAP相關或依賴SOAP)的數量已經倍增了到了令人驚訝的程度。

最初,SOAP是作為XML-RPC的擴展而發展起來的,它主要強調的是,透過從WSDL檔案中獲得的方法和變數名稱來進行遠端過程呼叫。現在,透過不斷進步,人們發現了更多的使用SOAP的方式,而不僅僅是採用「檔案」方式——基本上是使用一個SOAP信封來傳送XML格式化檔案。無論如何,要掌握SOAP,了解WSDL所扮演的角色是最根本的。

二、SOAP封包結構解析

SOAP的訊息稱為一個SOAP Envelope,包括SOAP Header和SOAP Body。其中,SOAP Header可以方便的插入各種其它訊息來擴充Web Service的功能,例如Security(採用憑證存取Web Service),SOAP Body則是具體的訊息正文,也就是Marshall後的資訊。

SOAP呼叫的時候,也就是向一個URL(例如 http://api.google.com/search/beta2)發送HTTP Post封包(根據SOAP規範,HTTP Get封包也可支援),呼叫方法的名字在HTTP Request Header SOAP-Action中給出,接下來就是SOAP Envelope了。服務端接到請求,執行計算,將回傳結果Marshall成XML,用HTTP回傳給客戶端。

三、SOAP簡單範例

SOAP開發一般有三種方式選擇:

1)、PEAR自帶的SOAP擴充;
2)、PHP自帶的SOAPAP擴充;
3)、NuSOAP(純PHP) 擴充。

PHP 5中新增了內建的SOAP擴展,作為PHP的一部分提供的,因此不需要下載、安裝和管理單獨的套件。這是第一個用C而不是PHP為PHP編寫的SOAP實現,因此作者聲稱它的速度要快得多。相關文件包含在PHP手冊的Function Reference部分(php_soap.dll)。

一個存取.NET WEB服務的客戶端範例:

< ? php
$objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL");
$param = array("ZipCode"=>&#39;12209&#39;);
$out = $objSoapClient->ValidateZip($param);
$data = $out->ValidateZipResult;
echo $data;
?>
登入後複製

四、實例

1)、用PHP建立SOAP服務

建立soap_server.php(虛擬路徑為:http://localhost/php/ soap/soap_server.php)

< ? php
/**
* A simple math utility class
*/
class math{
  /**
  * Add two integers together
  *
  * @param integer $a The first integer of the addition
  * @param integer $b The second integer of the addition
  * @return integer The sum of the provided integers
  */
  public function add($a, $b){
    return $a + $b;
  }
  /**
  * Subtract two integers from each other
  *
  * @param integer $a The first integer of the subtraction
  * @param integer $b The second integer of the subtraction
  * @return integer The difference of the provided integers
  */
  public function sub($a, $b){
    return $a - $b;
  }
  /**
  * Div two integers from each other
  *
  * @param integer $a The first integer of the subtraction
  * @param integer $b The second integer of the subtraction
  * @return double The difference of the provided integers
  */
  public function div($a, $b){
    if($b == 0){
      throw new SoapFault(-1, "Cannot divide by zero!");
    }
    return $a / $b;
  }
}
$server = new SoapServer(&#39;math.wsdl&#39;, array(&#39;soap_version&#39;=>SOAP_1_2));
$server->setClass("math");
$server->handle();
?>
登入後複製

   

註:

a)、math類是即將公開的webservice;
b)、$server->setClass,不是$server->addClass。
2)、用PHP客戶端存取剛建立SOAP服務

< ? php
// $client = new SoapClient(&#39;http://localhost/php/soap/math.wsdl&#39;);
$client = new SoapClient("http://localhost/php/soap/soap_server.php?WSDL");
try{
  $result = $client->div(8, 2); // will cause a Soap Fault if divide by zero
  print "The answer is: $result";
}catch(SoapFault $e){
  print "Sorry an error was caught executing your request: {$e->getMessage()}";
}
?>
登入後複製

本質上,http://localhost/php/soap/soap_server.php?WSDL就是要存取註解行所指的wsdl描述文件,所以這個WSDL檔案必須事先產生。而對於其他語言如Java則可以動態產生。對於PHP自帶的SOAP擴充要求這個WSDL檔案必須事先產生好。

可以用ZendStudio產生靜態的WSDL文件,此時用到math類別的phpdoc作為產生WSDL的元資料。用ZendStudio產生wsdl檔案時,必須正確說明Web服務目標位址,片段如下:

...
  <service name="mathService">
    <port binding="typens:mathBinding" name="mathPort">
      <soap:address location="http://localhost/php/soap/soap_server.php"></soap:address>
    </port>
  </service>
...
登入後複製

   

注:调用PHP Webserver的方法必须传入命名参数。

更多PHP使用SOAP扩展实现WebService的方法相关文章请关注PHP中文网!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

11個最佳PHP URL縮短腳本(免費和高級) 11個最佳PHP URL縮短腳本(免費和高級) Mar 03, 2025 am 10:49 AM

11個最佳PHP URL縮短腳本(免費和高級)

Instagram API簡介 Instagram API簡介 Mar 02, 2025 am 09:32 AM

Instagram API簡介

在Laravel中使用Flash會話數據 在Laravel中使用Flash會話數據 Mar 12, 2025 pm 05:08 PM

在Laravel中使用Flash會話數據

構建具有Laravel後端的React應用程序:第2部分,React 構建具有Laravel後端的React應用程序:第2部分,React Mar 04, 2025 am 09:33 AM

構建具有Laravel後端的React應用程序:第2部分,React

簡化的HTTP響應在Laravel測試中模擬了 簡化的HTTP響應在Laravel測試中模擬了 Mar 12, 2025 pm 05:09 PM

簡化的HTTP響應在Laravel測試中模擬了

php中的捲曲:如何在REST API中使用PHP捲曲擴展 php中的捲曲:如何在REST API中使用PHP捲曲擴展 Mar 14, 2025 am 11:42 AM

php中的捲曲:如何在REST API中使用PHP捲曲擴展

在Codecanyon上的12個最佳PHP聊天腳本 在Codecanyon上的12個最佳PHP聊天腳本 Mar 13, 2025 pm 12:08 PM

在Codecanyon上的12個最佳PHP聊天腳本

宣布 2025 年 PHP 形勢調查 宣布 2025 年 PHP 形勢調查 Mar 03, 2025 pm 04:20 PM

宣布 2025 年 PHP 形勢調查

See all articles