国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP SOAP 擴(kuò)展的使用

Cympros / 2354人閱讀

摘要:類也是一個(gè)只包含構(gòu)造器的低級(jí)類,與和類相似。安裝擴(kuò)展對(duì)于平臺(tái),需要在中加入如下代碼上面的工作完成之后,還需要注意的是擴(kuò)展在配置文件中有獨(dú)立的代碼片段這些配置項(xiàng)主要是用來(lái)指定處理文件時(shí)使用緩存的行為。支持與擴(kuò)展類似的。

原文地址:PHP SOAP 擴(kuò)展,本文在原文基礎(chǔ)上添加了一些內(nèi)容和章節(jié),也加入了一些注釋,請(qǐng)讀者注意。

前兩篇文章 《SOAP 介紹》 和 《SOAP Web 服務(wù)介紹》 已經(jīng)對(duì) SOAP 相關(guān)知識(shí)做了比較詳細(xì)的介紹。現(xiàn)在以 PHP 的 SOAP 擴(kuò)展為例,綜合運(yùn)用一下學(xué)習(xí)到的知識(shí)。

簡(jiǎn)介

PHP 的 SOAP 擴(kuò)展可以用來(lái)提供和使用 Web Services。換句話說(shuō),PHP 開(kāi)發(fā)者可以利用這個(gè) PHP 擴(kuò)展來(lái)寫他們自己的 Web Services,也可以寫一些客戶端來(lái)使用給定的 Web Services。

PHP5 中的這個(gè) SOAP 擴(kuò)展目的是為了實(shí)現(xiàn) PHP 對(duì) Web Services 的支持。與其它實(shí)現(xiàn) PHP 對(duì) Web Services 的支持的方法不同,SOAP 擴(kuò)展是用 C 寫的,因此它比其它方法具有速度優(yōu)勢(shì)。注:SOAP 擴(kuò)展是在 PHP5 才開(kāi)始提供,所以在此之前人們要使用 SOAP 去調(diào)用 Web Services 時(shí),一般是使用第三方提供的 SOAP 封裝庫(kù)來(lái)實(shí)現(xiàn),比如:NuSOAP。

SOAP 擴(kuò)展支持以下規(guī)范:

SOAP 1.1

SOAP 1.2

WSDL 1.1

SOAP 擴(kuò)展主要用來(lái)處理 RPC 形式的 Web Services。不過(guò),你也可以使用文本形式的 WSDL 文件配合 WSDL 模式的服務(wù)端和客戶端。

這個(gè)擴(kuò)展使用 GNOME XML 庫(kù)來(lái)處理XML。

擴(kuò)展中的類

這個(gè)擴(kuò)展實(shí)現(xiàn)了6個(gè)類。其中有三個(gè)高級(jí)的類,它們的方法很有用,它們是 SoapClient、SoapServer 和SoapFault。另外三個(gè)類除了構(gòu)造器外沒(méi)有其它別的方法,這三個(gè)是低級(jí)的類,它們是 SoapHeader、SoapParam 和 SoapVar。

SOAP 擴(kuò)展關(guān)系圖:

上圖并不是很準(zhǔn)確,因?yàn)?SoapServer 也可以在響應(yīng)時(shí)發(fā)送 SoapHeader。所有會(huì)有下面這個(gè)更加準(zhǔn)確的關(guān)系圖:

SoapClient 類

這個(gè)類用來(lái)使用 Web Services。SoapClient 類可以作為給定 Web Services 的客戶端。
它有兩種操作形式:

WSDL 模式

Non-WSDL 模式

在 WSDL 模式中,構(gòu)造器可以使用 WSDL 文件名作為參數(shù),并自動(dòng)從 WSDL 中提取使用服務(wù)時(shí)所需要的信息。

Non-WSDL 模式中使用參數(shù)來(lái)設(shè)置使用服務(wù)時(shí)所需要的信息。這個(gè)類有許多可以用來(lái)使用服務(wù)的有用的方法。其中 SoapClient::__soapCall() 是最重要的。這個(gè)方法可以用來(lái)調(diào)用服務(wù)中的某個(gè)操作。

SoapServer 類

這個(gè)類可以用來(lái)提供 Web Services。與 SoapClient 類似,SoapServer 也有兩種操作模式:WSDL 模式和 non-WSDL模式。這兩種模式的意義跟 SoapClient 的兩種模式一樣。在 WSDL 模式中,服務(wù)實(shí)現(xiàn)了 WSDL 提供的接口;在 non-WSDL 模式中,參數(shù)被用來(lái)管理服務(wù)的行為。

在 SoapServer 類的眾多方法中,有三個(gè)方法比較重要。它們是 SoapServer::setClass()、SoapServer::addFunction() 和 SoapServer::handle()。

SoapServer::setClass()方法設(shè)定用來(lái)實(shí)現(xiàn) Web Services 的類。SoapServer::setClass 所設(shè)定的類中的所有公共方法將成為 Web Services 的操作(operation)。

SoapServer::addFunction() 方法用來(lái)添加一個(gè)或多個(gè)作為 Web Services 操作(operation)的函數(shù)。

SoapServer:: handle() 方法指示 Web Services 腳本開(kāi)始處理進(jìn)入的請(qǐng)求。Web Services 腳本是用 PHP 腳本寫的一個(gè)或多個(gè) SoapServer 對(duì)象的實(shí)例。盡管你可以有不止一個(gè)的 SoapServer 對(duì)象,但通常的習(xí)慣是一個(gè)腳本只擁有一個(gè) SoapServer 實(shí)例。在調(diào)用 SoapServer::handle() 方法之前,Web Services 腳本會(huì)使用設(shè)置在 SoapServer 對(duì)象實(shí)例上的任何信息來(lái)處理進(jìn)入的請(qǐng)求和輸出相應(yīng)的內(nèi)容。

SoapFault 類

這個(gè)類從 Exception 類繼承而來(lái),可以用來(lái)處理錯(cuò)誤。SoapFault 實(shí)例可以拋出或獲取 Soap 錯(cuò)誤的相關(guān)信息并按程序員的要求處理。

SoapHeader 類

這個(gè)類可以用來(lái)描述 SOAP headers。它只是一個(gè)只包含構(gòu)造器方法的數(shù)據(jù)容器。

SoapParam 類

SoapParam 也是一個(gè)只包含構(gòu)造器方法的數(shù)據(jù)容器。這個(gè)方法可以用來(lái)描述傳遞給 Web Services 操作的參數(shù)。在 non-WSDL 模式中這是一個(gè)很有用的類,可以用來(lái)傳遞所期望格式的參數(shù)信息。

SoapVar 類

SoapVar 也是一個(gè)只包含構(gòu)造器的低級(jí)類,與 SoapHeader 和 SoapParam 類相似。這個(gè)類可以用來(lái)給一個(gè)Web Services 操作傳遞編碼參數(shù)。這個(gè)類對(duì) non-WSDL 中傳遞類型信息是非常有用的。


注:SoapParam 和 SoapVar 主要用來(lái)封裝用于放入 SOAP 請(qǐng)求中的數(shù)據(jù),他們主要在 non-WSDL 模式下使用。事實(shí)上,在 WSDL 模式下,SOAP 請(qǐng)求的參數(shù)可以通過(guò)數(shù)組方式包裝,SOAP 擴(kuò)展會(huì)根據(jù) WSDL 文件將這個(gè)數(shù)組轉(zhuǎn)化成為 SOAP 請(qǐng)求中的數(shù)據(jù)部分,所以并不需要這兩個(gè)類。而在 non-WSDL 模式下,由于沒(méi)有提供 WSDL 文件,所以必須通過(guò)這兩個(gè)類進(jìn)行包裝。

SoapHeader 類用來(lái)構(gòu)造 SOAP 頭,SOAP 頭可以對(duì) SOAP 的能力進(jìn)行必要的擴(kuò)展。SOAP 頭的一個(gè)主要作用就是用于簡(jiǎn)單的身份認(rèn)證。

WSDL VS. non-WSDL 模式

Web Services 有兩種實(shí)現(xiàn)模式:契約先行(Contract first)模式和代碼先行(Code first)模式。

契約先行模式使用了一個(gè)用 XML 定義的服務(wù)接口的WSDL文件。WSDL 文件定義了服務(wù)必須實(shí)現(xiàn)或客戶端可以使用的接口。SoapServer 和 SoapClient 的 WSDL 模式就基于這個(gè)概念。

在代碼先行模式中,首先要先寫出實(shí)現(xiàn)服務(wù)的代碼。然后在大多數(shù)情況下,代碼會(huì)產(chǎn)生一個(gè)契約(可以借助一些工具生成),換種說(shuō)法,一個(gè) WSDL 文件。接著客戶端在使用服務(wù)的時(shí)候就可以使用那個(gè) WSDL 來(lái)獲得服務(wù)的接口及其他信息。盡管如此,PHP5 的擴(kuò)展并沒(méi)有從代碼輸出一個(gè) WSDL 的實(shí)現(xiàn),考慮到這種情況,可以在 non-WSDL 模式下使用 SoapServer 和 SoapClient。

使用 SOAP 擴(kuò)展實(shí)現(xiàn) Hello World

這一節(jié)介紹如何使用 WSDL 模式和 non-WSDL 模式來(lái)實(shí)現(xiàn)服務(wù)和客戶端。相對(duì)而言,使用 WSDL 模式來(lái)實(shí)現(xiàn)服務(wù)和客戶端會(huì)比較容易,假定已經(jīng)有一個(gè)定義好了接口的 WSDL 文件。因此這一節(jié)會(huì)先介紹如何使用 WSDL 模式實(shí)現(xiàn)一個(gè) Web Service。

安裝 SOAP 擴(kuò)展

對(duì)于 Windows 平臺(tái),需要在 php.ini 中加入如下代碼:

extension = php_soap.dll

上面的工作完成之后,還需要注意的是 SOAP 擴(kuò)展在配置文件中有獨(dú)立的代碼片段:

[soap]
; Enables or disables WSDL caching feature.
; http://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1

; Sets the directory name where SOAP extension will put cache files.
; http://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="D:/wamp/tmp"

; (time to live) Sets the number of second while cached file will be used
; instead of original one.
; http://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400

; Sets the size of the cache limit. (Max. number of WSDL files to cache)
soap.wsdl_cache_limit = 5

這些配置項(xiàng)主要是用來(lái)指定 PHP 處理 WSDL 文件時(shí)使用緩存的行為。這幾個(gè)配置項(xiàng)分別說(shuō)明:是否開(kāi)啟 WSDL 文件緩存、文件緩存位置、緩存時(shí)間、以及最大緩存文件數(shù)量。啟用緩存會(huì)加快 PHP 處理 WSDL 文件的速度,但最好在調(diào)試代碼時(shí)關(guān)閉緩存,以避免一些因緩存行為而出現(xiàn)的問(wèn)題。

WSDL 文件

在這個(gè) Hello World 例子的服務(wù)中有一個(gè)被命名為 greet 的操作。這個(gè)操作有一個(gè)字符串形式的名字參數(shù)并返回一個(gè)字符串形式的 Hello + 名字。所用到的 WSDL 如下:


    
        
            
                
                    
                        
                    
                
            
            
                
                    
                        
                    
                
            
        
    
    
        
    
    
        
    
    
        
            
            
        
    
    
        
        
            
            
                
            
            
                
            
        
    
    
        
            
        
    

WSDL 模式服務(wù)端

下面是 WSDL 模式的服務(wù)使用 SOAP 擴(kuò)展來(lái)實(shí)現(xiàn)提供服務(wù)的代碼:

name;
    $result = [
        "greetReturn" => $value
    ];
    return $result;
}

$server = new SoapServer("hello.wsdl");
$server->addFunction("greet");
$server->handle();

在這個(gè)服務(wù)的實(shí)現(xiàn)過(guò)程中,函數(shù)實(shí)現(xiàn)了WSDL所定義的服務(wù)操作 greet,greet 操作有一個(gè) WSDL 指定的參數(shù),按照 greet 操作的語(yǔ)義,這個(gè)參數(shù)是一個(gè)用戶的名字。最后 handle 調(diào)用了觸發(fā)處理請(qǐng)求的服務(wù)對(duì)象。

WSDL 模式客戶端

客戶端代碼如下:

try {
    $client = new SoapClient("hello.wsdl");
    $result =  $client->__soapCall("greet", [
        ["name" => "Suhua"]
    ]);
    printf("Result = %s", $result->greetReturn);
} catch (Exception $e) {
    printf("Message = %s",$e->__toString());
}

客戶端代碼中,首先創(chuàng)建一個(gè)使用 WSDL 文件作參數(shù)的 SoapClient 實(shí)例。接著使用 __soapCall() 調(diào)用 greet 方法,并傳入?yún)?shù)。

下面是客戶端所發(fā)送的 SOAP 請(qǐng)求:



    
        
            Suhua
        
    

下面是服務(wù)端響應(yīng)上訴請(qǐng)求而發(fā)送的 SOAP 響應(yīng):



    
        
            Hello Suhua
        
    

上面的 SOAP 消息都是利用 WSDL 模式下的服務(wù)端和客戶端來(lái)獲取的(可以使用 __getLastResponse 和 __getLastRequest 這兩個(gè)方法獲取,前提是客戶端初始化時(shí),要把 trace 參數(shù)設(shè)置為 true)。也可以利用 non-WSDL 模式的服務(wù)端和客戶端來(lái)產(chǎn)生與上面相同的 SOAP 消息。但是,PHP 代碼必須有一點(diǎn)改變。下一節(jié)會(huì)說(shuō)明如何使用 non-WSDL 模式。

non-WSDL 模式服務(wù)端
function greet($param)
{
    $value = "Hello ".$param;
    return new SoapParam($value, "greetReturn");
}

$server = new SoapServer(null, [
    "uri" => "http://localhost/php-soap/non-wsdl/helloService"
]);

$server->addFunction("greet");
$server->handle();

在 non-WSDL 模式中,像 WSDL 模式一樣首先實(shí)現(xiàn) greet 函數(shù)的功能,但是函數(shù)實(shí)現(xiàn)的方式跟 WSDL 模式稍稍有所不同。在 non-WSDL 模式中,我們必須返回一個(gè) SoapParam 對(duì)象作為響應(yīng),而不是一個(gè)數(shù)組。創(chuàng)建服務(wù)時(shí),第一個(gè)參數(shù)設(shè)為 null,說(shuō)明沒(méi)有提供 WSDL;接著傳遞一個(gè)選項(xiàng)作為參數(shù),這個(gè)選項(xiàng)參數(shù)是服務(wù)的 URI。最后像 WSDL 模式一樣調(diào)用剩下的方法。

non-WSDL 模式客戶端
try {
    $client = new SoapClient(null, [
        "location" => "http://localhost/php-soap/non-wsdl/hello_service_non_wsdl.php",
        "uri" => "http://localhost/php-soap/non-wsdl/helloService"
    ]);

    $result =  $client->__soapCall("greet", [
        new SoapParam("Suhua", "name")
    ]);

    printf("Result = %s", $result);
} catch (Exception $e) {
    printf("Message = %s",$e->__toString());
}

在 non-WSDL 模式中,因?yàn)闆](méi)有使用 WSDL,傳遞了一個(gè)包含服務(wù)所在位置(location)和服務(wù) URI 的參數(shù)數(shù)組作為參數(shù)。然后像 WSDL 模式中一樣調(diào)用 __soapCall() 方法,但是使用了 SoapParam 類用指定格式打包參數(shù)。返回的結(jié)果將獲取 greet 方法的響應(yīng)。

注:客戶端實(shí)例化時(shí)所傳入的服務(wù) URI,實(shí)際上,我們可以把它看作該服務(wù)的一個(gè)命名空間(namespace)。客戶端所傳入的 URI 必與服務(wù)端所命名的 URI 一樣。

結(jié)論

這篇文章介紹了 SOAP 擴(kuò)展,可以在 PHP 中通過(guò)它來(lái)提供和使用 Web Services。PHP SOAP 擴(kuò)展的強(qiáng)項(xiàng)是它的簡(jiǎn)單和快速。使用 C 寫的 SOAP 擴(kuò)展來(lái)運(yùn)行服務(wù)端和客戶端是非常簡(jiǎn)單的。雖然 SOAP 擴(kuò)展在處理一些簡(jiǎn)單的 Web Services 時(shí)很有用,但是當(dāng)用它來(lái)處理所有的 Web Services 時(shí)就表現(xiàn)出它的局限性。WSO WSF/PHP 就是為了彌補(bǔ) PHP 擴(kuò)展的缺陷而開(kāi)發(fā)的,它是開(kāi)源的,可以實(shí)現(xiàn) SOAP 類似的功能并且支持 MTOM,WS-Addressing,WS- Security 和 WS-RelaiableMessaging。WSO2 WSF/PHP 支持與 SOAP 擴(kuò)展類似的 API。我們正計(jì)劃將 API 打包起來(lái)提供跟 SOAP 擴(kuò)展一樣的 API,會(huì)用 C 來(lái)寫。

最后

這篇文章的原文 PHP SOAP Extension,中文譯文 PHP SOAP 擴(kuò)展。在轉(zhuǎn)載這篇文章的時(shí)候,對(duì)文章添加了一些注釋以及本人的一些見(jiàn)解,而且例子也是重新編寫的,所以與原文比會(huì)有所不同。本文的所有代碼將會(huì)被放到 notes 倉(cāng)庫(kù)中,方便以后翻閱和復(fù)習(xí)。(本文已存檔 GitHub)

參考文獻(xiàn)

PHP SOAP 擴(kuò)展

PHP SOAP Extension

PHP SOAP 擴(kuò)展詳解

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/21133.html

相關(guān)文章

  • 學(xué)習(xí) PHP SOAP 擴(kuò)展一些筆記

    摘要:對(duì)的相關(guān)學(xué)習(xí)就先告此一段落,這是最后一篇文章用來(lái)記錄下學(xué)習(xí)過(guò)程中的一些筆記和心得。對(duì),沒(méi)錯(cuò)在還沒(méi)有提供擴(kuò)展前,的確很多人也是這樣做的。總結(jié)上面都是自己在學(xué)習(xí)擴(kuò)展時(shí)的一些零散的筆記,如果有不對(duì)的地方,希望大家指出,謝謝。 對(duì) SOAP 的相關(guān)學(xué)習(xí)就先告此一段落,這是最后一篇文章用來(lái)記錄下學(xué)習(xí)過(guò)程中的一些筆記和心得。 前面三篇文章分別是: 《SOAP 介紹》 《SOAP Web 服務(wù)介紹...

    wthee 評(píng)論0 收藏0
  • php實(shí)現(xiàn)webservice(實(shí)測(cè)C#及java可調(diào)用)

    摘要:具體如何操作這里跳過(guò),實(shí)現(xiàn)是需要擴(kuò)展的。返回值也很特別,不是直接返回,而是把它放到一個(gè)對(duì)象里再返回。返回值中值對(duì)應(yīng)的是中的名稱。最后按運(yùn)行可以查看到對(duì)應(yīng)的輸出,如下圖所示,說(shuō)明實(shí)現(xiàn)的在中可以正確調(diào)用。 使用PHP搭建起一個(gè)其他語(yǔ)言如C#、JAVA可用的Webservice的方法與網(wǎng)上大多數(shù)所述的用PHP建立的webservice感覺(jué)是有差別的。對(duì)于接口的輸入?yún)?shù)及輸出參數(shù)較為復(fù)雜的情況...

    arashicage 評(píng)論0 收藏0
  • PHP7.0.0在OS X編譯安裝

    摘要:目前支持和協(xié)議。除此以外,還能在可能的字符編碼之間相互進(jìn)行編碼轉(zhuǎn)換。如果啟用了這個(gè)功能,輸入字符編碼可能將自動(dòng)轉(zhuǎn)換成。這些可能在未來(lái)增加。 前言 PHP7即將在12月3日正式發(fā)布,而RC8是已經(jīng)差不多穩(wěn)定了的版本,后續(xù)的GA版本主要都是在修復(fù)bug,所以為了未來(lái)開(kāi)發(fā)環(huán)境的升級(jí),準(zhǔn)備嘗試安裝一下。 PHP7.0.0將在12月3日正式發(fā)布,但是12月2日時(shí)github已經(jīng)發(fā)布出PHP-7...

    lordharrd 評(píng)論0 收藏0
  • composer - 平臺(tái)軟件包

    摘要:將那些已經(jīng)安裝在系統(tǒng)上,但并不是由安裝的包視為一個(gè)虛擬的平臺(tái)軟件包。表示用戶的版本要求,你可以對(duì)其做出限制。可以幫你指定需要的擴(kuò)展包括核心擴(kuò)展。允許對(duì)庫(kù)的版本進(jìn)行限制。你可以使用命令來(lái)獲取可用的平臺(tái)軟件包的列表。 Composer 將那些已經(jīng)安裝在系統(tǒng)上,但并不是由 Composer 安裝的包視為一個(gè)虛擬的平臺(tái)軟件包。這包括PHP本身,PHP擴(kuò)展和一些系統(tǒng)庫(kù)。 php 表示用戶的 P...

    ziwenxie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Cympros

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<