SOAP 介紹

簡介

SOAP(Simple Object Access Protoco)簡單對象訪問協議是在分散或分佈式的環境中交換信息的簡單的協議,是一個基於 XML 的協議。此協議規範由 IBM、Microsoft、UserLand 和 DevelopMentor 在1998年共同提出,並獲得 IBM,蓮花(Lotus),康柏(Compaq)等公司的支持,於2000年提交給萬維網聯盟(World Wide Web Consortium;W3C)。如今,SOAP 協議規範由萬維網聯盟的 XML工做組維護。SOAP 1.2 版在2003年6月24日成爲 W3C 的推薦版本。html

SOAP 協議包括如下四個部分的內容:git

  1. SOAP 封裝(envelop),封裝定義了一個描述消息中的內容是什麼,是誰發送的,誰應當接受並處理它以及如何處理它們的框架;github

  2. SOAP 編碼規則(encoding rules),它定義了不一樣應用程序間交換信息時,須要使用到的數據類型;web

  3. SOAP RPC 表示(RPC representation),它定義了一個表示遠程過程調用和應答的協定;服務器

  4. SOAP 綁定(binding),它定義 SOAP 使用哪一種底層協議交換信息的協定。使用 HTTP/TCP/UDP 協議均可以;框架

四個部分之間的關係

SOAP 消息基本上是從發送端到接收端的單向傳輸,但它們經常結合起來執行相似於請求 / 應答的模式。全部的 SOAP 消息都使用 XML 編碼。一條 SOAP 消息就是一個包含有一個必需的 SOAP 的封裝包,一個可選的 SOAP 標頭(Header)和一個必需的 SOAP 體塊(Body)的 XML 文檔。分佈式

把 SOAP 綁定到 HTTP 提供了同時利用 SOAP 的樣式和分散的靈活性的特色以及 HTTP 的豐富的特徵庫的優勢。在HTTP上傳送 SOAP 並非說 SOAP 會覆蓋現有的 HTTP 語義,而是 HTTP 上的 SOAP 語義會天然的映射到 HTTP 語義。在使用 HTTP 做爲協議綁定的場合中, RPC 請求映射到 HTTP 請求上,而 RPC 應答映射到 HTTP 應答。然而,在 RPC 上使用 SOAP 並不只限於 HTTP 協議綁定。SOAP也能夠綁定到TCP和UDP協議上。ide

雖然這四個部分都做爲 SOAP 的一部分,做爲一個總體定義的,但他們在功能上是相交的、彼此獨立的。特別的,信封(envelop)和編碼規則(encoding rules)是被定義在不一樣的 XML 命名空間中,這樣使得定義更加簡單。svg

語法規則

  1. SOAP 消息必須用 XML 來編碼;工具

  2. SOAP 消息必須使用 SOAP Envelope 命名空間;

  3. SOAP 消息必須使用 SOAP Encoding 命名空間;

  4. SOAP 消息不能包含 DTD 引用;

  5. SOAP 消息不能包含 XML 處理指令;

SOAP 消息格式

SOAP 消息的格式比較簡單,以下圖:

SOAP 消息格式

下面是一條 SOAP 消息的基本格式:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Header>
        <!-- 消息頭,可選 -->
    </soap:Header>
    <soap:Body>
        <!-- 消息內容,必需 -->

        <soap:Fault>
            <!-- 錯誤信息,可選 -->
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

一條 SOAP 消息就是一個普通的 XML 文檔,包含以下元素:

  1. 必需的 Envelope 元素,據此可把該 XML 文檔標識爲一條 SOAP 消息;

  2. 可選的 Header 元素,包含頭部信息,通常用於身份驗證;

  3. 必需的 Body 元素,包含全部的調用和響應信息;

  4. 可選的 Fault 元素,提供有關在處理此消息時,所發生的錯誤的描述信息;

語法規則詳解

SOAP Envelope

Envelope 是 SOAP 消息結構的主要容器,也是 SOAP 消息的根元素,它必須出如今每一個 SOAP 消息中,用於把此 XML 文檔標示爲一條 SOAP 消息。

在 SOAP 中,使用命名空間將 SOAP 消息元素與應用程序自定義的元素區分開來,將 SOAP 消息元素的做用域限制在一個特定的區域。

<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
</soap:Envelope>

SOAP 的 encodingStyle 屬性用於定義在文檔中使用的數據類型。此屬性可出如今任何 SOAP 元素中,並會被應用到元素的內容及元素的全部子元素上。

SOAP Header

這個是可選的,若是須要添加 Header 元素,那麼它必須是 Envelope 的第一個子元素。Header 還能夠包含0個或多個可選的子元素,這些子元素稱爲 Header 項,全部的 Header 項通常來講是屬於某個特定與接口相關的命名空間。

<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Header>
        <AuthenHeader xmlns="http://www.example.com">
            <sAuthenticate>string</sAuthenticate>
        </AuthenHeader>
    </soap:Header>
    <soap:Body>
    </soap:Body>
</soap:Envelope>

Header 元素用於與消息一塊兒傳輸一些附加的消息,如身份驗證信息等。

SOAP Body

SOAP 消息的 Body 元素能夠包含如下任何元素:

  1. 遠程過程調用(RPC)的方法及其參數;

  2. 目標應用程序(消息接收者即接口調用者)所須要的數據;

  3. 報告故障和狀態消息的 SOAP Fault;

全部 Body 元素的直接子元素都稱爲 Body 項,全部 Body 項通常是屬於某個特色的命名空間的。

SOAP 請求消息例子:

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <getMobileCodeInfo xmlns="http://www.example.com">
            <mobileCode>string</mobileCode>
            <userID>string</userID>
        </getMobileCodeInfo>
    </soap:Body>
</soap:Envelope>

SOAP 響應消息例子:

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <getMobileCodeInfoResponse xmlns="http://www.example.com">
            <getMobileCodeInfoResult>string</getMobileCodeInfoResult>
        </getMobileCodeInfoResponse>
    </soap:Body>
</soap:Envelope>

注:以上例子表示經過手機號獲取手機號歸屬地等信息。第一個例子是請求消息,第二個例子是它的響應消息。

SOAP Fault

Fault 元素用於在 SOAP 消息中傳輸錯誤及狀態信息。若是 SOAP 消息中包括 Fault 元素,它必須做爲一個 Body 的子元素出現,並且至多出現一次。Fault 元素自己也包含有描述錯誤詳細信息的子元素。它包含如下子元素:faultcodefaultstringfaultactordetail

子元素 描述
faultcode 供識別故障的代碼
faultstring 可供人閱讀的有關故障的說明
faultactor 有關是誰引起故障的信息
detail 有關涉及 Body 元素的應用程序專用錯誤信息

其中 faultcode 是每一條錯誤消息都會提供的元素,它的值通常是如下錯誤代碼之一:

錯誤代碼 描述
VersionMismatch 無效的 SOAP Envelope 命名空間
MustUnderstand 沒法理解 Header 中擁有屬性 mustUnderstand = 1 的子元素
Client 消息結構錯誤,或包含了不正確的信息
Server 服務器出現錯誤

注:以上關於 SOAP Fault 的描述不徹底適用於 SOAP 1.2 版本。由於 SOAP 1.2 版本在返回錯誤信息時,Fault 的子元素及其內容已經有所不一樣。具體看下面的例子:

SOAP v1.1 錯誤消息例子:

<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    <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>

SOAP v1.2 錯誤消息例子:

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <soap:Fault>
            <soap:Code>
                <soap:Value>soap:Sender</soap:Value>
            </soap:Code>
            <soap:Reason>
                <soap:Text xml:lang="en">Input string was not in a correct format.</soap:Text>
            </soap:Reason>
            <soap:Detail/>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

從以上返回結果來看,其實所返回的錯誤信息內容並無太多改變,只是 XML 的元素髮生了一些變化,具體還須要讀者本身理解。

總結

本文章節有點亂,還算是把 SOAP 的基本知識點都過了一遍。接下來,我將會結合一些實例,進一步說明 SOAP 的特色以及如何使用 SOAP Web 服務。(本文已存檔 Github

參考文獻

  1. 淺談 SOAP

  2. SOAP 詳解

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

  4. 簡單對象訪問協議(維基百科)

  5. XML 命名空間(XML Namespaces)

  6. SOAP 和 WSDL 的一些必要知識

  7. WebService 筆記=>SOAP 消息結構

其餘

  1. 查詢手機歸屬地信息服務:http://webXml.com.cn

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

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

相關文章
相關標籤/搜索