簡介
php的soap擴充套件可以用來提供和使用web services。換句話說,php開發者可以利用這個php擴充套件來寫他們自己的web services,也可以寫一些客戶端來使用給定的web services。
php5中的這個soap擴充套件目的是為了實現php對web services的支援。與其它實現php對web services的支援的方法不同,soap擴充套件是用c寫的,因此它比其它方法具有速度優勢。
soap擴充套件支援以下規範。
* soap 1.1
* soap 1.2
* wsdl 1.1
soap擴充套件主要用來處理rpc形式的web services。不過,你也可以使用文字形式的wsdl檔案配合wsdl模式的服務端和客戶端。
這個擴充套件使用 gnome xml庫來處理xml。
擴充套件中的類
soapclient類
這個類用來使用web services。soapclient類可以作為給定web services的客戶端。
它有兩種操作形式:
* wsdl 模式
* non-wsdl 模式
在wsdl模式中,構造器可以使用wsdl檔名作為引數,並從wsdl中提取服務所使用的資訊。
non-wsdl模式中使用引數來傳遞要使用的資訊。這個類有許多可以用來使用服務的有用的方法。其中soapclient::__soapcall()是最重要的。這個方法可以用來呼叫服務中的某個操作。
soapserver類
這 個類可以用來提供web services。與soapclient類似,soapserver也有兩種操作模式:wsdl模式和non-wsdl模式。這兩種模式的意義跟 soapclient的兩種模式一樣。在wsdl模式中,服務實現了wsdl提供的介面;在non-wsdl模式中,引數被用來管理服務的行為。
在soapserver類的眾多方法中,有三個方法比較重要。它們是soapserver::setclass(),soapserver::addfunction()和soapserver::handle()。
soapserver::setclass()方法設定用來實現web service的類。soapserver::setclass所設定的類中的所有公共方法將成為web services的操作(operation)。
soapserver::addfunction()方法用來新增乙個或多個作為web services操作(operation)的函式。
soapserver:: handle()方法指示web service指令碼開始處理進入的請求。web service指令碼是用php指令碼寫的乙個或多個soapserver物件的例項。儘管你可以有不止乙個的soapserver物件,但通常的習慣是乙個 指令碼只擁有乙個soapserver例項。在呼叫soapserver::handle()方法之前,web service指令碼會使用設定在soapserver物件例項上的任何資訊來處理進入的請求和輸出的相應。
soapfault類
這個類從exception類繼承而來,可以用來處理錯誤。soapfault例項可以丟擲或獲取soap錯誤的相關資訊並按程式設計師的請求處理。
soapheader類
這個類可以用來描述soap headers。它只是乙個只包含構造器方法的資料容器。
soapvar類
wsdl vs. non-wsdl模式
web services有兩種實現模式:契約先行(contract first)模式和**先行(code first)模式。
契約先行模式使用了乙個用xml定義的服務介面的wsdl檔案。wsdl檔案定義了服務必須實現或客戶端必須使用的介面。soapserver和soapclient的wsdl模式就基於這個概念。
在 **先行模式中,首先要先寫出實現服務的**。然後在大多數情況下,**會產生乙個契約,換種說法,乙個wsdl。接著客戶端在使用服務的時候就可以使用 那個wsdl來獲得服務的介面。儘管如此,php5的擴充套件並沒有從**輸出乙個wsdl的規定,考慮到這種情況,可以在non-wsdl模式下使用 soapserver和soapclient。
soap擴充套件與hello world
使用wsdl,伺服器端的介面方式是任何人都可以看見的;使用non-wsdl,訪問的方法和引數需要使用者(客戶端)和提供服務者(伺服器端)私下定義,沒有明文方式。
這一節介紹如何使用wsdl模式和non-wsdl模式來實現服務和客戶端。相對而言,使用wsdl模式來實現服務和客戶端會比較容易,假定已經有乙個定義了介面的wsdl檔案。因此這一節會先介紹如何使用wsdl模式實現乙個web service。
在這個hello world例子的服務中有乙個被命名為greet的操作。這個操作有乙個字串形式的名字並返回乙個字串形式的greeting。所用到的wsdl如下:
xmlns:impl=』
xmlns:intf=』
xmlns:wsdl=』
xmlns:wsdlsoap=』
xmlns:xsd=』
targetnamespace=』>
xmlns:impl=』
xmlns:intf=』
xmlns:wsdl=』
xmlns=」
targetnamespace=』 >
wsdl模式服務
下面是wsdl模式的服務所使用的soap擴充套件api**:
<?php
function greet($param)
$server = new soapserver(『hello.wsdl』);
$server->addfunction(『greet』);
$server->handle();
?>
在這個服務的實現過程中,函式實現了wsdl所定義的服務操作greet,greet操作有乙個wsdl指定的引數,按照greet操作的語義,這個引數是乙個使用者的名字。最後handle呼叫了觸發處理請求的服務物件。
wsdl模式客戶端
客戶端**如下
<?php
try catch (exception $e)
?>
客戶端**中,首先建立乙個使用wsdl檔案作引數的soapclient例項。接著__soapcall()呼叫作為引數傳入它的操作,也就是greet和傳入操作的引數。
請求和響應
當你將上述的php指令碼放在你web伺服器目錄下的文件中,並利用web瀏覽器或在php解析器的命令列呼叫指令碼,客戶端傳送乙個soap請求到服務端指令碼,服務端將向客戶端傳送乙個soap響應來響應客戶端的請求。
下面是客戶端所傳送的soap請求:
<?xml version=」1.0″ encoding=」utf-8″?>
xmlns:ns1=」>
sam
下面是服務端響應上訴請求而傳送的soap響應:
<?xml version=」1.0″ encoding=」utf-8″?>
xmlns:ns1=」>
hello sam
上面的soap訊息都是利用wsdl模式的服務端和客戶端來獲取的。也可以利用non-wsdl模式的服務端和客戶端來產生與上面相同的soap訊息。但是,php**必須有一點改變。下一節會說明如何使用non-wsdl模式。
non-wsdl模式服務端
<?php
function greet($param)
$server = new soapserver(null, array(『uri』 => 『));
$server->addfunction(『greet』);
$server->handle();
?>
non-wsdl模式客戶端
<?php
try catch (exception $e)
?>
結論
這篇文章介紹了soap擴充套件,可以在php中通過它來提供和使用web services。php擴充套件的強項是它的簡單和快速。使用c寫的soap擴充套件來執行服務端和客戶端是非常簡單的。雖然soap擴充套件在處理一些簡單的 web services時很有用,但是當用它來處理所有的web services時就表現出它的侷限性。 wso wsf/php就是為了彌補php擴充套件的缺陷而開發的,它是開源的,可以實現soap類似的功能並且支援mtom,ws-addressing,ws- security和ws-relaiablemessaging。wso2 wsf/php 支援與soap擴充套件類似的api。我們正計畫將api打包起來提供跟soap擴充套件一樣的api,會用c來寫。
利用PHP SOAP實現WEB SERVICE
php有兩個擴充套件可以實現web service,乙個是nusoap,乙個是php 官方的soap擴充套件,由於soap是官方的,所以我們這裡以soap來實現web service.由於預設是沒有開啟soap擴充套件的,所以自己先看一下soap擴充套件有沒有開啟。在soap編寫web servic...
利用php soap實現web service
今天學習到soap,偶遇到一介紹soap的博文,mark下。php有兩個擴充套件可以實現web service,乙個是nusoap,乙個是php 官方的soap擴充套件,由於soap是官方的,所以我們這裡以soap來實現web service.由於預設是沒有開啟soap擴充套件的,所以自己先看一下s...
PHP SOAP 教程 例項一
基礎篇 一 為了公開介面,被其他的應用程式呼叫,經常需要建立soap端,而在php中,soap的使用自從php4就有 了廣泛的使用,開源的例如nosoap都是很不錯的soap類,在php5開始,就已經支援soap了,在php soap.dll 如 果需要,請確定你的php5 的php.ini的soa...