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

資訊專欄INFORMATION COLUMN

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

wthee / 1629人閱讀

摘要:對(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ù)介紹》

《PHP SOAP 擴(kuò)展的使用》

如何理解

因?yàn)?SOAP Web 服務(wù)是基于 HTTP 協(xié)議的,發(fā)出一個(gè) SOAP 消息請(qǐng)求,實(shí)際上利用 HTTP 動(dòng)詞中的 POST,然后把 SOAP 消息放置在 HTTP body 里面發(fā)送。簡(jiǎn)單來(lái)說(shuō)就是:每調(diào)用一次 SOAP 服務(wù),就是發(fā)送一條 POST 請(qǐng)求。

下面是一次請(qǐng)求接口所發(fā)送的內(nèi)容:

POST /webservices/qqOnlineWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.4.29
Content-Type: application/soap+xml; charset=utf-8; action="http://WebXml.com.cn/qqCheckOnline"
Content-Length: 247



    
        
            8698053
        
    

我們可以看到,一次 SOAP 請(qǐng)求,實(shí)際上就是向服務(wù)器端發(fā)送了一個(gè) POST 請(qǐng)求。而發(fā)送的內(nèi)容正是 SOAP 消息(它表明你本次調(diào)用的接口方法以及參數(shù)等等)。

這個(gè) POST 請(qǐng)求,有一些特點(diǎn),比如:它發(fā)送的內(nèi)容類型為:application/soap+xml,用戶代理為 PHP-SOAP/5.4.29 ,其他特點(diǎn)自己觀察,不多說(shuō)。

SOAP 擴(kuò)展的作用

實(shí)際上,既然我們知道請(qǐng)求一次接口只是發(fā)送一次 POST 請(qǐng)求,那么我們完全可以使用一些工具或 PHP 本身自帶的一些庫(kù)(比如 curl、fsockopen)模擬發(fā)送 POST 請(qǐng)求,而不需要使用 PHP 的 SOAP 擴(kuò)展。對(duì),沒(méi)錯(cuò)!在 PHP 還沒(méi)有提供 SOAP 擴(kuò)展前,的確很多人也是這樣做的。

那干嘛要用 SOAP 擴(kuò)展呢? 因?yàn)樗倬W(wǎng)的唄,因?yàn)樗?C 語(yǔ)言寫(xiě)的,速度杠杠的,而且封裝得很好用,也不需要自己編寫(xiě)繁瑣的 XML 代碼了,所以就用它。

換句話說(shuō),實(shí)際上 SOAP 擴(kuò)展就是一個(gè)更好用,速度更快,專門(mén)用于處理 SOAP 服務(wù)的 HTTP 封裝庫(kù),沒(méi)有什么很深?yuàn)W的東西。

使用方法

PHP 的幫助手冊(cè),有關(guān)于 SOAP 擴(kuò)展的詳細(xì)說(shuō)明文檔,已經(jīng)對(duì)如何使用說(shuō)得很清楚了,特別手冊(cè)后面的一些用戶的評(píng)論和貢獻(xiàn)的代碼片段,基本上可以解決你大部分的問(wèn)題。下面記錄一下自己在開(kāi)發(fā)過(guò)程中遇到的一些問(wèn)題,以及解決的方法和一些需要注意的地方。

WSDL 和 non-WSDL

現(xiàn)在基本上所有 SOAP Web 服務(wù)都提供 WSDL 接口描述文件,所以 non-WSDL 這種模式基本上不用考慮。

關(guān)于 SOAP 版本

PHP SOAP 擴(kuò)展同時(shí)支持 SOAP 1.1 和 SOAP 1.2 兩個(gè)版本。一般來(lái)說(shuō),現(xiàn)在的接口基本上也同時(shí)支持這兩個(gè) SOAP 協(xié)議版本進(jìn)行通信,那么在這種情況下,當(dāng)然是采用高版本的 SOAP 1.2 了。實(shí)際上,無(wú)論你是使用哪個(gè)版本,如果你是使用 SOAP 擴(kuò)展來(lái)調(diào)用服務(wù)的話,在使用該擴(kuò)展過(guò)程中沒(méi)有任何區(qū)別,對(duì)你來(lái)說(shuō)都是一樣的。唯一需要你去做的是在 SoapCient 進(jìn)行初始化時(shí),把 soap_version 設(shè)置為 SOAP_1_1 或 SOAP_1_2 即可,就像下面這樣:

// SOAP 1.1 
$client = new SoapClient($wsdl, [
    "soap_version" => SOAP_1_1
]);

// SOAP 1.2
$client = new SoapClient($wsdl, [
    "soap_version" => SOAP_1_2
]);
SoapParam 和 SoapVar

上面已經(jīng)說(shuō)了,現(xiàn)在的服務(wù)基本上都提供 WSDL 描述文件,如果是這樣的話,這兩個(gè)類 SoapParamSoapVar 你基本上可以不用管,因?yàn)?SOAP 之所以提供這兩個(gè)類,主要還是為了 PHP SOAP 擴(kuò)展能夠去使用一些沒(méi)有 WSDL 描述文件的服務(wù),當(dāng)然這種情況基本上已經(jīng)不存在了。

關(guān)于 __soapCall 方法

該方法也一樣,一般都它只會(huì)用于 non-WSDL 模式下,因?yàn)樵?WSDL 模式下,完全可以把你需要調(diào)用的方法作為 SoapClient 對(duì)象的一個(gè)方法進(jìn)行調(diào)用。不過(guò),如果調(diào)用方法的 uri 與 默認(rèn)的 uri 不一樣時(shí),又或者調(diào)用該方法時(shí),你必須為它帶上一個(gè) SOAP Header 時(shí),就需要使用 __soapCall 方法了。下面是摘自官方手冊(cè)的一段話:

This is a low level API function that is used to make a SOAP call. Usually, in WSDL mode, SOAP functions can be called as methods of the SoapClient object. This method is useful in non-WSDL mode when soapaction is unknown, uri differs from the default or when sending and/or receiving SOAP Headers.

__soapCall 在使用上與通過(guò)方法名直接調(diào)用的方式有一些區(qū)別。下面我們來(lái)看看幾個(gè)例子。同樣的,我們還是使用一個(gè)網(wǎng)絡(luò)上可以免費(fèi)使用的 SOAP 服務(wù)配合我們,該服務(wù)的主要作用是通過(guò) QQ 號(hào)來(lái)查詢?cè)撚脩舻脑诰€狀態(tài)。服務(wù)地址

下面是請(qǐng)求該服務(wù)時(shí),應(yīng)該發(fā)送的 SOAP 消息:



    
        
            string
        
    

通過(guò)方法名調(diào)用該接口:

 SOAP_1_2
]);

$client->qqCheckOnline([
    "qqCode" => 8698053
]));

使用 __soapCall 方法調(diào)用該接口:

 SOAP_1_2
]);

$client->__soapCall("qqCheckOnline", [
    ["qqCode" => 8698053]
]);

重點(diǎn)關(guān)注兩種調(diào)用方式時(shí),參數(shù)的不一樣。通過(guò)方法名直接調(diào)用的方式,參數(shù)是一維數(shù)組,而通過(guò) __soapCall 方法調(diào)用時(shí),參數(shù)是二維數(shù)組,這是它們之間的區(qū)別之一。

還有第二個(gè)區(qū)別,就是 __soapCall 方法可以在調(diào)用接口時(shí),添加額外的 SOAP Header,比如這樣:

$wsdl = "http://www.example.com/service.asmx?wsdl";
$client = new SoapClient($wsdl, [
    "soap_version" => SOAP_1_2
]);

$auth = ["sAuthenticate" => "ab3cde34f5r4545g"];
$namespace = "http://www.example.com";

$header = new SoapHeader($namespace, "AuthenHeader", $auth, false);
$client->__soapCall("SomeFunction", $parameters, null, $header);

雖然 SoapClient 也有 __setSoapHeaders 方法,但是它會(huì)給該實(shí)例的所有方法都添加上 SOAP Header,如果存在有些方法需要 SOAP Header 而有些又不需要的話,那么就必須使用 __soapCall 方法,針對(duì)某個(gè)方法來(lái)添加 SOAP Header 了。

關(guān)于命名空間(namespace)

實(shí)際上,在 WSDL 模式下,如果不需要發(fā)送 SOAP Header 的話,那么 namespace 是用不上的,因?yàn)?namespace 實(shí)際上已經(jīng)在 WSDL 文件中有所描述了,PHP 的 SOAP 擴(kuò)展會(huì)自動(dòng)把它從 WSDL 文件中解析出來(lái),用于構(gòu)造 SOAP 請(qǐng)求。如果 SOAP 消息中,需要添加 SOAP Header 的話,那么必須提供 namespace。舉個(gè)例子:

比如說(shuō),有一個(gè)服務(wù)它需要你發(fā)送的 SOAP 消息中必須有 SOAP Header,像下面一樣:



    
        
            string
        
    
    
        
            int
        
    

下面是構(gòu)造該 SOAP 請(qǐng)求的代碼:

 SOAP_1_2
]);

$auth = ["sAuthenticate" => "ab3cde34f5r4545g"];
$namespace = "http://www.example.com";

$header = new SoapHeader($namespace, "AuthenHeader", $auth, false);
$client->__setSoapHeaders($header);    

$response = $client->GetUserInfoById([
    "UserID" => 100
]);

可以看到,使用 SoapHeader 來(lái)構(gòu)建一個(gè) SOAP Header 時(shí),必須提供 namespace,而且是正確的命名空間。

其實(shí),構(gòu)造一個(gè) SOAP Header 的方法不止這一種寫(xiě)法,還有其他寫(xiě)法,比如你還可以這樣構(gòu)造與上面一樣的 SOAP 消息:

sAuthenticate = $auth;
    }
}

$wsdl = "http://www.example.com/service.asmx?wsdl";
$client = new SoapClient($wsdl, [ 
    "soap_version" => SOAP_1_2 
]);

$auth = "ab3cde34f5r4545g";
$namespace = "http://www.example.com";

$authenHeader = new AuthenHeader($auth);

$header = new SoapHeader($namespace, "AuthenHeader", $authenHeader, false);
$client->__setSoapHeaders($header);

$response = $client->GetUserInfoById([ 
    "UserID" => 100 
]);

關(guān)于 SoapHeader 其他更多的用法,推薦翻閱 PHP 手冊(cè)中的 SOAP 章節(jié)。

關(guān)于 SoapFault

服務(wù)端在處理客戶端請(qǐng)求發(fā)生錯(cuò)誤時(shí),將會(huì)拋出 SoapFault 異常。對(duì)于 SOAP 擴(kuò)展中,哪些方法可能會(huì)拋出異常可以查看手冊(cè)。一旦發(fā)生了異常,我們都應(yīng)該捕捉它們,并妥善處理。像下面這樣:

try {
    $client = new SoapClient($wsdl, [
        "trace" => true,
        "soap_version" => SOAP_1_2
    ]);

    .....
} catch(SoapFault $e) {
    //在這里處理異常
}
getLastRequest 和 getLastResponse

這兩個(gè)方法可以查看最近一次請(qǐng)求和響應(yīng)的內(nèi)容,這兩個(gè)方法對(duì)于調(diào)試很有幫助。當(dāng)然,這兩個(gè)方法只有在 SoapClient 實(shí)例化時(shí),trace 參數(shù)設(shè)置為 true 才會(huì)生效。比如像這樣:

 true,
    "soap_version" => SOAP_1_2
]);

$client->qqCheckOnline([
    "qqCode" => 8698053
]));

echo $client->__getLastRequest();
echo $client->__getLastResponse();

getLastRequest() 輸出的內(nèi)容:



    
        
            8698053
        
    

getLastResponse() 輸出的內(nèi)容:



    
        
            Y
        
    

SoapUI 調(diào)試工具

在調(diào)試 SOAP 服務(wù)接口時(shí),我們可以使用功能強(qiáng)大的 SoapUI 工具,可以很方便地調(diào)試接口。

總結(jié)

上面都是自己在學(xué)習(xí) PHP SOAP 擴(kuò)展時(shí)的一些零散的筆記,如果有不對(duì)的地方,希望大家指出,謝謝。(本文已存檔 GitHub)

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

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

相關(guān)文章

  • PHP SOAP 擴(kuò)展使用

    摘要:類也是一個(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ù)介紹》...

    Cympros 評(píng)論0 收藏0
  • 全棧開(kāi)發(fā)自學(xué)路線

    摘要:前言這里筑夢(mèng)師是一名正在努力學(xué)習(xí)的開(kāi)發(fā)工程師目前致力于全棧方向的學(xué)習(xí)希望可以和大家一起交流技術(shù)共同進(jìn)步用簡(jiǎn)書(shū)記錄下自己的學(xué)習(xí)歷程個(gè)人學(xué)習(xí)方法分享本文目錄更新說(shuō)明目錄學(xué)習(xí)方法學(xué)習(xí)態(tài)度全棧開(kāi)發(fā)學(xué)習(xí)路線很長(zhǎng)知識(shí)拓展很長(zhǎng)在這里收取很多人的建議以后決 前言 這里筑夢(mèng)師,是一名正在努力學(xué)習(xí)的iOS開(kāi)發(fā)工程師,目前致力于全棧方向的學(xué)習(xí),希望可以和大家一起交流技術(shù),共同進(jìn)步,用簡(jiǎn)書(shū)記錄下自己的學(xué)習(xí)歷程...

    galaxy_robot 評(píng)論0 收藏0
  • 全棧開(kāi)發(fā)自學(xué)路線

    摘要:前言這里筑夢(mèng)師是一名正在努力學(xué)習(xí)的開(kāi)發(fā)工程師目前致力于全棧方向的學(xué)習(xí)希望可以和大家一起交流技術(shù)共同進(jìn)步用簡(jiǎn)書(shū)記錄下自己的學(xué)習(xí)歷程個(gè)人學(xué)習(xí)方法分享本文目錄更新說(shuō)明目錄學(xué)習(xí)方法學(xué)習(xí)態(tài)度全棧開(kāi)發(fā)學(xué)習(xí)路線很長(zhǎng)知識(shí)拓展很長(zhǎng)在這里收取很多人的建議以后決 前言 這里筑夢(mèng)師,是一名正在努力學(xué)習(xí)的iOS開(kāi)發(fā)工程師,目前致力于全棧方向的學(xué)習(xí),希望可以和大家一起交流技術(shù),共同進(jìn)步,用簡(jiǎn)書(shū)記錄下自己的學(xué)習(xí)歷程...

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

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

0條評(píng)論

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