1. 程式人生 > >Web Service 訊息格式

Web Service 訊息格式

原文連結譯文連結,譯者:朱張鎖,校對:郭蕾

當客戶端和Web Service伺服器進行通訊時,他們交換訊息。客戶端傳送請求訊息到Web Service伺服器。 Web Service伺服器響應並返回訊息。這就像普通的HTTP,瀏覽器傳送一個HTTP請求到Web伺服器, Web伺服器會提供一個HTTP響應。

最初唯一可用的Web Service訊息格式是SOAP,後來出現了REST式的Web Service,它採用純XML和HTTP。隨著REST的興起,出現了很多人使用JSON(JavaScript物件符號)作為訊息格式。另外一個很簡單的遠端協議被稱為XML-RPC(XML遠端過程呼叫)。 對最常見的是SOAP協議我不會在這裡詳述訊息格式細節,因為在後續的教程中會提到。在這裡,我只是簡單提一下。

web-service-overview-1

客戶端傳送請求到web服務,並且接收web服務的響應

SOAP

SOAP(簡單物件訪問協議)是基於XML的訊息格式。下面是一個簡單的SOAP訊息:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

    <soap:Header>
    </soap:Header>

    <soap:Body
> ... message data ... <soap:Fault> </soap:Fault> </soap:Body> </soap:Envelope>

正如你可以看到一個SOAP訊息包括:

  • Envelope
  • Header
  • Body
    • Message Data
    • Fault (optional)

相同的SOAP訊息結構用於客戶端和Web Service伺服器之間的請求和響應。

Body內的Fault元素是可選的。只有Web服務中發生內部錯誤裡才返回。否則,返回正常資訊資料。

SOAP不指定一個訊息從客戶端如何獲取到Web Service,但最常見的情況是通過HTTP。

REST + XML

REST(具象狀態傳輸)Web服務與SOAP Web服務有一點不同。一個REST請求就像一個普通的瀏覽器傳送一個簡單的HTTP請求到Web伺服器。一般情況不傳送XML請求。一個REST響應通常在一個普通的HTTP響應中傳送回一個XML文件,就像瀏覽器請求一樣。

在REST中,你不用太多關注“服務”方面,而是在“資源”。一個資源有一個給定的URL,就像在一個網站的HTML頁面。比如社交應用中一個使用者的基本資訊資源,可能是下面的網址:

http://social.jenkov.com/profiles/jakobjenkov

這個URL可能會返回一個XML文件(資源)描述了我。 返回的XML檔案會是下面這樣:

<profile>
    <firstName>Jakob</firstName>
    <lastName>Jenkov</lastName>
    <address>
        <street>The Road 123</street>
        <zip>12345</zip>
        <city>Copenhagen</city>
    </address>
</profile>

REST也自然地支援資源的集合。舉例來說,這個URL可能代表所有的公共使用者配置檔案的列表:

http://social.jenkov.com/profiles/

下面是這樣的XML配置檔案列表的一個例子:
<profiles>
    <profile>...</profile>
    <profile>...</profile>
    <profile>...</profile>
</profiles>

上面這兩個網址只能讀取一個資源或資源集合。如果您需要修改REST中的資源,您需要傳送不同的HTTP請求到伺服器。當你讀一個資源要傳送HTTP GET請求。如果你需要寫一個資源,就需要傳送一個HTTP PUT來代替。如果你需要刪除一個資源,需要傳送一個HTTP DELETE等。

REST + JSON

REST+ JSON跟REST + XML基本上是一樣的,只不過傳輸的資料是JSON(JavaScript物件符號)格式的。JSON的基於XML的優點是Web瀏覽器能夠自然地解析JSON結構並且轉換成JavaScript物件,不需要自己在瀏覽器中轉換。這使得許多使用AJAX的應用程式變得簡單。

下面是一個json的例子:

{
    firstName : "Jakob",
    lastName  : "Jenkov",
    address   : {
       street : "The Road 123",
       zip    : "12345",
       city   : "Copenhagen"
    }
}

XML RPC

相比REST,XML RPC更類似於SOAP,XML RPC的請求和響應都是一樣的格式,相比SOAP ,XML RPC是一種較為簡單的協議,它很接近標準過程呼叫的建模。有些人聲稱,XML RPC現在已死或過時。

下面是一個XML RPC的請求示例:

POST /RPC2 HTTP/1.0
User-Agent: My XML-RPC API/1.0.0 (Win7)
Host: jenkov.com
Content-Type: text/xml
Content-length: 200

<?xml version="1.0"?>
<methodCall>
    <methodName>getProfile</methodName>
    <params>
        <param>
            <value><string>Jakob Jenkov</string></value>
        </param>
    </params>
</methodCall>

標註:這個HTTP請求的Content-Length頭沒有正確設定,它應該是XML請求的位元組數。

下面是一個XML RPC響應示例:

HTTP/1.1 200 OK
Connection: close
Content-Length: 213
Content-Type: text/xml
Date: Wed, 03 Feb 2010 20:00:00 GMT+1
Server: jenkov.com
    
<?xml version="1.0"?>
<methodResponse>
    <params>
        <param>
            <struct>
                <member>
                    <name>firstName</name>
                    <value>Jakob</value>
                </member>
                <member>
                    <name>lastName</name>
                    <value>Jenkov</value>
                </member>
                <member>
                    <name>address</name>
                    <value>
                        <struct>...</struct>
                    </value>
                </member>
            </struct>
        </param>
    </params> 
</methodResponse>