RESTful Web Services Cookbook-改善可擴(kuò)展性與簡(jiǎn)約型的解決方案

使用統(tǒng)一接口

HTTP是一種應(yīng)用層協(xié)議,然而,包括SOAP和一些Ajax Web框架在內(nèi)的不少技術(shù)都將HTTP作為一種傳輸信息協(xié)議,這種方法很難充分利用HTTP層的基礎(chǔ)設(shè)施。

1.1如何保持交互的可見性

作為應(yīng)用協(xié)議,HTTP的設(shè)計(jì)目標(biāo)是在客戶端和服務(wù)器之間保持對(duì)庫(kù)、服務(wù)器、代理、緩存、和其他工具的可見性。

識(shí)別設(shè)計(jì)資源,就可以使用GET方法獲取資源表示,使用PUT方法更新資源,使用DELETE方法刪除資源,使用POST方法執(zhí)行各種不安全和非等冪的操作;添加適當(dāng)?shù)腍TTP表頭來描述請(qǐng)求和響應(yīng)。

保持請(qǐng)求和響應(yīng)的可見性,可以具備以下特性:

  • 緩存:緩存響應(yīng)內(nèi)容,并在資源修改時(shí)使緩存自動(dòng)失效。
  • 樂觀并發(fā)控制:檢測(cè)并發(fā)寫入,并在操作過期的表述時(shí)防止資源發(fā)生變更。
  • 內(nèi)容協(xié)商:在給定資源的多個(gè)表示中,選擇合適的表述。
  • 安全性和等冪性:確??蛻舳丝梢灾貜?fù)或重試特定的HTTP請(qǐng)求。

可見性的實(shí)現(xiàn):

  • HTTP交互是無狀態(tài)的。
  • HTTP使用一個(gè)統(tǒng)一接口。
  • HTTP使用一種與MIME類似的信封格式進(jìn)行表述編碼。

1.2何時(shí)需權(quán)衡可見性

有多個(gè)共享數(shù)據(jù)的資源,或一個(gè)操作要修改多個(gè)資源,可考慮降低可見性。得到更好的信息抽象、松散的耦合度、更好的網(wǎng)絡(luò)效率、更好的資源粒度。

1.3如何維護(hù)應(yīng)用程序狀態(tài)

在客戶端保存應(yīng)用程序的狀態(tài)

  • 將應(yīng)用程序狀態(tài)編碼到URI里,并通過鏈接在表述中包含這些URI??蛻舳耸褂眠@些URI進(jìn)行資源交互
  • 狀態(tài)較大,或出于安全性考慮,則可以持久化存儲(chǔ)(如數(shù)據(jù)庫(kù)、文件系統(tǒng))應(yīng)用程序狀態(tài),并將其狀態(tài)的引用編碼在URI中。

資源表述中的鏈接是保持應(yīng)用程序狀態(tài)的最后地方。

  • 應(yīng)當(dāng)選擇形如數(shù)據(jù)庫(kù)或文件系統(tǒng)的持久化存儲(chǔ)來保存應(yīng)用程序狀態(tài)。
  • 當(dāng)數(shù)據(jù)量較小時(shí),服務(wù)器可以將狀態(tài)編碼在URI中。
  • 在鏈接中保存應(yīng)用程序的狀態(tài),要加入檢查方式(如簽名)檢測(cè)和防止偽造狀態(tài)。

1.4如何在服務(wù)器端實(shí)現(xiàn)安全和冪等的方法

方法 安全 冪等
GET YES YES
HEAD YES YES
OPTIONS YES YES
PUT NO YES
DELETE NO YES
POST NO NO
  • 安全性并不意味服務(wù)每次都返回同一結(jié)果。它只表明客戶端可以發(fā)起請(qǐng)求,并知道它不會(huì)改變資源的狀態(tài)。
  • 冪等性保證客戶端重復(fù)發(fā)起某個(gè)請(qǐng)求的效果一致。

1.5如何在客戶端處理安全和冪等方法

  • 把GET,OPTIONS和HEAD看做只讀。
  • 在網(wǎng)絡(luò)和軟件出錯(cuò)時(shí),重新提交GET、PUT、DELETE請(qǐng)求做確認(rèn)。
  • 不重復(fù)提交POST請(qǐng)求。

1.6何時(shí)使用GET方法

  • 使用GET方法進(jìn)行安全和冪等的信息獲取。
  • 添加 Cache-Control:no-cache 頭來確保響應(yīng)不被緩存。

1.7何時(shí)使用POST

  • 創(chuàng)建新的資源:把資源作為一個(gè)工廠。
  • 通過一個(gè)控制器資源來修改一個(gè)或多個(gè)資源。
  • 執(zhí)行需要大數(shù)據(jù)輸入的查詢。
  • 在其他HTTP方法不合適時(shí),執(zhí)行不安全或非冪等的操作。

1.8如何使用POST方法創(chuàng)建資源

POST方法的應(yīng)用場(chǎng)合之一是創(chuàng)建新資源,該協(xié)議類似使用“工廠方法模式”創(chuàng)建新對(duì)象。

  • 客戶端向工廠資源提交附有創(chuàng)建資源表示的POST請(qǐng)求
  • 資源創(chuàng)建后,返回響應(yīng)碼201(Created),并在Location頭部中包含新創(chuàng)建資源的URI。
  • 響應(yīng)中表述的(Content-Location)URI
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評(píng)論 19 139
  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,938評(píng)論 0 6
  • 一說到REST,我想大家的第一反應(yīng)就是“啊,就是那種前后臺(tái)通信方式。”但是在要求詳細(xì)講述它所提出的各個(gè)約束,以及如...
    時(shí)待吾閱讀 3,602評(píng)論 0 19
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 霞浦縣的東壁村依山傍海、視野寬闊,特別是種植及收割紫菜的季節(jié),成排的紫菜架、穿梭其中的舢板船只,場(chǎng)景極為壯觀。這里...
    櫻桃SH閱讀 1,078評(píng)論 4 5

友情鏈接更多精彩內(nèi)容