設計表述
客戶端所關(guān)心的資源是一個抽象的實體,它是用URI來標識的。另一方面,表述是具體而真實的,你在客戶端和服務器上針對它編寫代碼,進行操作。
HTTP在請求和響應中為表述提供了一種包裝格式。設計表述設計:
1.使用HTTP提供的格式包含正確的標頭,
2.當表述有正文時,為正文選擇合適的媒體類型并設計一種格式。
如何使用實體頭來注解表述
表述不僅僅是以某種格式序列化后的數(shù)據(jù),它是一連串字節(jié)加上用于描述那些字節(jié)的元數(shù)據(jù)。在HTTP中,表述元數(shù)據(jù)是由使用實體頭的名值對來實現(xiàn)的。
使用以下標頭來注解包含消息正文的表述:
-
Conent-Type
,用于描述表述類型,包含charset 參數(shù)或其他針對該媒體類型而定義的參數(shù)。 -
Content-Length
,用于指定表述正文的字節(jié)大小。HTTP1.1支持一種更有效的機制,名為分塊轉(zhuǎn)移編碼(chuncked transfer encoding) -
Content-Language
,如果您以某種語言對表述進行本地化,用該標頭來指定語言。 -
Content-MD5
,工具/軟件 在處理或存儲表述時,可能存在錯誤,需要提供一致性校驗,用該標頭來包含一個表述正文的MD5摘要,在進行內(nèi)容編碼(gzip,compress等)之后,轉(zhuǎn)移編碼(即chunked)之前計算摘要值。請注意,TCP使用checksum在傳輸層提供一致性校驗。 -
Content-Encoding
,當你使用gzip,compress或deflate對表述正文進行編碼時,使用該標頭。 -
Last-Modified
,用來說明服務器修改表述或資源的最后時間。
HTTP的設計是這樣的,發(fā)送方可以用一系列名為實體頭的標頭來描述表述
正文(也稱為實體正文或消息正文)。有了這些標頭,接收方可以在無須查看正文的情況下決定如何處理正文。它們還可以將解析正文所需要提前了解及猜測的內(nèi)容減到最小程度。
如何解釋實體頭
當服務器或客戶端接受到表述時,在處理請求前正確地解釋實體頭是很重要的。本節(jié)討論了如何從所包含的標頭中解釋表述。
-
Content-Type
:接收到不帶Content-Type的表述時,客戶端將其視為不正確的響應,服務器返回錯誤碼400 -
Content-Length
在沒有確定接受到的表述不帶Transfer-Encoding:chunked前,不要檢查Content-Length頭是否存在。 -
Content-Encoding
讓您的網(wǎng)絡庫代碼來解壓那些壓縮過的表述。 -
Content-Language
如果存在該標頭,讀取并存儲它的值,記錄下所使用的語言。
3.6如何設計JSON表述
在每個表述中,包含一個指向該資源的self鏈接,對于那些組成資源的應用程序領域?qū)嶓w,在表述中包含它們的標識符。如果表述中的對象是本地化的,添加一個屬性來表示本地化內(nèi)容的語言。
如何設計集合表述
客戶端會在集合成員中進行迭代,由于某些集合會包含大量成員資源,客戶端需要對集合進行分頁或滾動顯示,在每個集合表述中包含以下內(nèi)容:
- 一個指向集合資源的self鏈接
- 如果集合是分頁的,并且還有下一頁,要有一個指向下一頁的鏈接。
- 如果集合是分頁的,并且還有上一頁,要有一個指向上一頁的鏈接。
- 一個集合大小的指示符
3.11如何在表述中編碼二進制數(shù)據(jù)
使用multipart/mixed,multipart/related 或multipart/alternative這樣的分段媒體類型,避免使用Base64編碼將二進制數(shù)據(jù)與文本格式編碼在一起。
分段消息讓你能把不同格式的數(shù)據(jù)整合到一個HTTP消息中。一個分段消息包含多個消息部分,由邊界進行分割,每個部分都可以包含不同媒體類型的消息。
--abcd
Content-type:application/xml;charset=UTF-8
<movie> ... <./movie>
--abcd
Content-type:video/mpeg
<video></video>
--abcd--
該分段消息有兩個部分,一部分包含了一個XML文檔,另一部分包含一個視頻。
分段媒體類型:
multipart/form-data
把鍵值對數(shù)據(jù)與任意媒體類型的數(shù)據(jù)編碼在一起,與您用HTML表單上傳文件時的用法一致。
multipart/mixed
分段消息把application/xml表示的電影元數(shù)據(jù)和video/mpeg表示的視頻整合進了一個HTTP消息中
multipart/alternative
multipart/related
當消息的各個部分是互相關(guān)聯(lián)的,而且需要一起處理這些部分時,使用該媒體類型,第一部分是根,可以通過Content-ID頭引用其他部分
如何返回錯誤
HTTP 基于表述的交換,對于錯誤來說也是如此,當服務器發(fā)生錯誤時,都會返回一個反映錯誤在的表述。