SOAP Web 服務介紹

已經跨入 2015 年,當今最爲常見的兩種 Web 服務類型分別是: REST 和 SOAP 。不過,從趨勢來看,愈來愈多人已經開始使用 REST 風格的 Web 服務。而 SOAP 大多也開始或已經轉型 REST,應該說 REST 會慢慢成爲主流。這篇文章不會對 REST 介紹太多,主要的重點仍是介紹一下 SOAP 風格的 Web 服務。html

Web Service 三要素

實際上,如今說 「Web Service 三要素」應該是不算很準確了,不過這個概念一直這樣沿用,並且本文咱們爲了更能清楚闡釋 SOAP Web 服務,那麼就這樣定義。git

Web Service 的三個要素分別是:github

  1. SOAP(Simple Object Access Protoco) 簡單對象訪問協議;web

  2. WSDL(Web Services Description Language) 網絡服務描述語言;segmentfault

  3. UDDI(Universal Description Discovery and Integration)一個用來發布和搜索 WEB 服務的協議(非必須);服務器

SOAP 用來描述傳遞信息的格式規範, WSDL 用來描述如何訪問具體的接口(好比它會告訴你該服務有哪些接口可使用,參數是什麼等等), UDDI 用來管理、分發和查詢 Web Service。下面咱們將逐一詳細介紹這三個要素,並經過結合實例來進行闡釋。網絡

爲了把這三個要素說得更清楚,咱們將會使用一個免費的 SOAP Web 服務做爲例子進行闡述。該服務只提供一個接口即:根據 QQ 號,獲取 QQ 在線狀態。查看該服務工具

SOAP

它是一個協議,能夠簡單的理解爲:它定義了一個基於 XML 的可擴展消息信封格式。由於客戶端與服務器進行交互,因爲你們的平臺和應用程序都不同,因此你們約定都採用 SOAP 這個協議來規範交互時的須要傳遞的消息。post

請求接口時,發送的消息例子:ui

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <qqCheckOnline xmlns="http://WebXml.com.cn/">
            <qqCode>8698053</qqCode>
        </qqCheckOnline>
    </soap:Body>
</soap:Envelope>

接口響應時,返回的消息例子:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <qqCheckOnlineResponse xmlns="http://WebXml.com.cn/">
            <qqCheckOnlineResult>Y</qqCheckOnlineResult>
        </qqCheckOnlineResponse>
    </soap:Body>
</soap:Envelope>

注:以上例子是使用 SOAP 1.1 發送的消息,SOAP 1.2 發送的消息格式其實大同小異,具體本身查看接口文檔

下面對它結構進行詳細說明。

XML 聲明

<?xml version="1.0" encoding="utf-8"?>

該行是 XML 聲明。它定義 XML 的版本 (1.0) 和所使用的編碼(utf-8)。

Envelope 元素

<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    ....
</soap:Envelope>

Envelope 元素是 SOAP 消息的固定根元素,SOAP 協議規定的,不能變,其中 xmlns 是 XML Namespace 的縮寫,表示 XML 命名空間。xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"Envelope的一個屬性,它表示定義個以 soap 爲前綴的命名空間 http://schemas.xmlsoap.org/soap/envelope/,即命名空間的名字是:http://schemas.xmlsoap.org/soap/envelope/,而它的前綴是 soap,這樣子就把 soap 前綴與該命名空間進行了綁定。即任何用 soap 爲前綴的元素都屬於該命名空間的,包括根元素 Envelope 。舉個例子:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <qqCheckOnline xmlns="http://WebXml.com.cn/">
            <qqCode>8698053</qqCode>
        </qqCheckOnline>
    </soap:Body>
</soap:Envelope>

其中,EnvelopeBody 元素就是以 soap 爲前綴的,那麼 EnvelopeBody 元素都是屬於 http://schemas.xmlsoap.org/soap/envelope/ 這個命名空間的。

同時,SOAP 協議中規定,SOAP 消息必須使用 SOAP Envelope 命名空間,因此 http://schemas.xmlsoap.org/soap/envelope/ 這個命名空間是固定的不能變(注意:這裏只針對 SOAP 1.1 版本,SOAP 1.2 會有所不一樣)。全部 SOAP 消息元素,好比:EnvelopeHeaderBodyFault 也都必須屬於該命名空間。

Body 元素

<soap:Body>
    <qqCheckOnline xmlns="http://WebXml.com.cn/">
        <qqCode>8698053</qqCode>
    </qqCheckOnline>
</soap:Body>

Body 元素裏面,通常都是放一些請求和響應的內容。qqCheckOnline 表示要調用的接口方法,而 qqCode 就是調用該方法時,傳入的參數,固然參數能夠有多個。

其中,qqCheckOnline 元素上也定義了一個命名空間 http://WebXml.com.cn/。值得注意的是,這裏在定義命名空間時,並無設置命名空間前綴(namespace prefix)。這種設置方式,會把當前元素及其全部子元素,都歸屬於該命名空間。瞭解 XML 命名空間

咱們看到,SOAP 消息元素和應用程序自己的元素是屬於不一樣的命名空間,這樣有利於把 SOAP 消息元素與其餘元素區分開來,固然也防止了與自定義元素重名的問題。

Header 元素

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <AuthenHeader xmlns="http://www.example.com">
            <sAuthenticate>string</sAuthenticate>
        </AuthenHeader>
    </soap:Header>
    <soap:Body>
    ......
    </soap:Body>
</soap:Envelope>

有些接口須要提供 Header 元素,它和 Body 信息一塊兒發送,它通常用於身份驗證等做用。例子中的 AuthenHeadersAuthenticate 都是接口自定義的參數。

Fault 元素

當調用服務發生錯誤時,錯誤信息通常會被放置在 Fault 元素內。例如:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Input string was not in a correct format.</faultstring>
            <detail/>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

Fault 元素內還有 faultcodefaultstringdetail,用於描述錯誤信息用的。在上一篇文章:《SOAP 介紹》中已經對該知識點進行了比較詳細的說明,有興趣能夠看看。

WSDL

一個 XML 格式的文檔。它用於描述該服務有哪些可用方法、參數的數據類型、命名空間等等信息。它的目的是讓你知道該如何使用該服務,包括調用的各類細節信息。WSDL 文檔一般用來輔助生成服務器和客戶端代碼及配置信息。

契約先行與代碼先行模式

在開發 Web Service 過程當中有兩種實現模式:契約先行(Contract first)模式和代碼先行(Code first)模式。

契約先行模式:首要工做是定義針對這個 Web 服務的接口的 WSDL(Web Services Description Language,Web 服務描述語言 ) 文件。WSDL 文件中描述了 Web 服務的位置,可提供的操做集,以及其餘一些屬性。WSDL 文件也就是 Web 服務的 「契約」。「契約」 訂立以後,再據此進行服務器端和客戶端的應用程序開發。

代碼先行模式:與契約先行模式不一樣,代碼先行模式中,第一步工做是實現 Web 服務端,而後根據服務端的實現,用某種方法(自動生成或手工編寫)生成 WSDL 文件。

實際上,一個 WSDL 文件也挺複雜的,通常本身也不會去直接看這個文件,而是須要用到某個方法時,直接看該方法的調用說明就好。好比:得到騰訊QQ在線狀態

UDDI

UDDI 是一個專門用來管理 Web 服務的地方。Web Service 服務提供商能夠經過兩種方式來暴露它的 WSDL 文件地址:

  1. 註冊到 UDDI 服務器,以便被人查找;

  2. 直接告訴給客戶端調用者;

是否須要註冊到 UDDI 其實是可選的,通常公司內部使用的服務,也不會註冊到 UDDI。只有那些但願全部人都知道該服務的地址,纔會註冊到 UDDI。

最後

這篇文章寫得有點亂了,主要仍是本身對 SOAP 的瞭解還不夠,最起碼我並無真正開發過 SOAP 服務。不過不要緊吧,慢慢來,文章能夠隨着知識的增加慢慢潤色。上文其實有一些問題沒有說清楚的,好比說:SOAP 服務的適合用在哪裏,不適合用在哪裏等等。若是你有興趣,能夠看看文章最後的幾篇參考文獻。(本文已存檔 Github

參考文獻

  1. 簡單對象訪問協議(百度百科)

  2. Web服務

  3. PHP SOAP 擴展

  4. Web Service 究竟是什麼?

其餘

  1. 得到騰訊QQ在線狀態服務:qqCheckOnline

  2. SOAP 服務調試工具:SoapUI 5.2

  3. XML 在線格式化工具:Web Toolkit Online

相關文章
相關標籤/搜索