REST API在實際工作中的挑戰(zhàn)

摘要

軟件開發(fā)從單機軟件到互聯(lián)網(wǎng)化,從互聯(lián)網(wǎng)單體應(yīng)用到系統(tǒng)拆分、前后端分離舔腾,再到現(xiàn)在的微服務(wù)叛溢。軟件架構(gòu)越來越龐大復(fù)雜,相關(guān)聯(lián)的領(lǐng)域劃分更細(xì)致、職責(zé)更專一,這樣各部分之間的交互就很頻繁。RESTful作為一種架構(gòu)風(fēng)格颈畸、一種接口設(shè)計規(guī)范,簡單没讲、標(biāo)準(zhǔn)眯娱、易擴展讓其得到了越來越多的應(yīng)用。然而在實際工作中爬凑,REST API也會帶來一些新的挑戰(zhàn):接口無法抽象為資源徙缴、多變的URI不容易做監(jiān)控等。

什么是REST API嘁信?

REST 全稱 Representational State Transfer于样,翻譯為資源表現(xiàn)層狀態(tài)轉(zhuǎn)化,資源指服務(wù)中的實體或信息潘靖;表現(xiàn)層指信息的展現(xiàn)形式穿剖,如json、xml卦溢、html等糊余;狀態(tài)轉(zhuǎn)化指接口訪問過程中數(shù)據(jù)和狀態(tài)的變化,作為http無狀態(tài)服務(wù)单寂,業(yè)務(wù)的實現(xiàn)必然要涉及到數(shù)據(jù)和狀態(tài)的變化贬芥。

RESTful的本質(zhì)是一種軟件架構(gòu)風(fēng)格,核心在于面向資源設(shè)計接口宣决,即將所有的接口描述為對資源的操作蘸劈,目的在于降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性尊沸。設(shè)計的準(zhǔn)則主要有以下幾點:

  • REST API 圍繞資源設(shè)計威沫,資源是可由客戶端訪問的任何類型的對象贤惯、數(shù)據(jù)或服務(wù)。每個資源有一個標(biāo)識符壹甥,即唯一標(biāo)識該資源的 URI救巷。
  • 客戶端通過交換資源的表示形式來與服務(wù)交互壶熏。REST API 使用統(tǒng)一接口句柠,這有助于分離客戶端和服務(wù)實現(xiàn)。 對于基于 HTTP 構(gòu)建的 REST API棒假,統(tǒng)一接口包括使用標(biāo)準(zhǔn) HTTP 謂詞對資源執(zhí)行操作溯职。 最常見的操作是 GET、POST帽哑、PUT谜酒、PATCH 和 DELETE。
  • REST API 使用無狀態(tài)請求模型妻枕。

URI標(biāo)識資源

REST API采用面向資源的思想僻族,所以在設(shè)計之初首先需要考慮的是有哪些資源可供操作。資源是一個很寬泛的概念屡谐,任何寄宿于Web可供操作的事物均可視為資源述么。資源可以體現(xiàn)為經(jīng)過持久化處理保存到磁盤上的某個文件或者數(shù)據(jù)庫中某個表的某條記錄,也可以是Web應(yīng)用接受到請求后采用某種算法計算得出的結(jié)果愕掏。資源可以體現(xiàn)為一個具體的物理對象度秘,它也可以是一個抽象的流程。

一個資源必須具有一個或者多個標(biāo)識饵撑,既然我們設(shè)計的Web API剑梳,那么很自然地應(yīng)該采用URI來作為資源的標(biāo)識。作為資源標(biāo)識的URI最好具有可讀性滑潘,因為具有可讀性的URI更容易被使用垢乙,使用者一看就知道被標(biāo)識的是何種資源,比如如下一些URI就具有很好的可讀性语卤。

http://www.artech.com/employees/c001(編號C001的員工)
http://www.artech.com/sales/2013/12/31(2013年12月31日的銷售額)
http://www.artech.com/orders/2013/q4(2013年第4季度簽訂的訂單)

除了必要的標(biāo)志性和可選的可讀性之外侨赡,標(biāo)識資源的URI應(yīng)該具有可尋址性。也就是說粱侣,URI不僅僅指明了被標(biāo)識資源所在的位置羊壹,而且通過這個URI可以直接獲取目標(biāo)資源,即每個資源有一個唯一標(biāo)識該資源的 URI齐婴。

HTTP方法表示動作

對于Web來說油猫,針對資源的操作通過HTTP方法來體現(xiàn)。常見的HTTP方法有其中:GET柠偶、HEAD情妖、DELETE睬关、PUT、POST毡证、PATCH电爹。它們的含義如下:

  • GET 檢索位于指定 URI 處的資源的表示形式。 響應(yīng)消息的正文包含所請求資源的詳細(xì)信息料睛。
  • HEAD 獲取目標(biāo)資源的元數(shù)據(jù)信息丐箩,服務(wù)器一般將對應(yīng)資源的元數(shù)據(jù)置于響應(yīng)的報頭集合返回給客戶端,這樣的響應(yīng)一般正文恤煞。
  • POST 在指定的 URI 處創(chuàng)建新資源屎勘。 請求消息的正文將提供新資源的詳細(xì)信息。
  • PUT 在指定的 URI 處創(chuàng)建或替換資源居扒。 請求消息的正文指定要創(chuàng)建或更新的資源概漱。
  • PATCH 對資源執(zhí)行部分更新。 請求正文包含要應(yīng)用到資源的一組更改喜喂。
  • DELETE 刪除位于指定 URI 處的資源瓤摧。

需要注意的是:對于發(fā)送PUT請求以修改某個存在的資源,服務(wù)器一般會將提供資源將原有資源整體覆蓋掉玉吁;如果需要進行局部修改照弥,推薦采用PATCH方法,因為從語義上講Patch就是打補丁的意思诈茧。PUT 請求必須是冪等的产喉。 如果客戶端多次提交同一個 PUT 請求,結(jié)果應(yīng)始終相同敢会,而我們不需要保證保證 POST 和 PATCH 請求的冪等性曾沈。

無狀態(tài)性

REST只維護資源的狀態(tài),而不需要維護客戶端的狀態(tài)鸥昏。對于它來說塞俱,每次請求都是全新的,它只需要針對本次請求作相應(yīng)的操作吏垮,不需要將本次請求的相關(guān)信息記錄下來以便用于后續(xù)來自相同客戶端請求的處理障涯。REST 獨立于任何基礎(chǔ)協(xié)議,并且不一定綁定到 HTTP膳汪。由于HTTP協(xié)議本身就是無狀態(tài)的唯蝶, 最常見的 REST 實現(xiàn)使用 HTTP 作為應(yīng)用程序協(xié)議。

遇到的挑戰(zhàn)

RESTful的設(shè)計風(fēng)格可以極大提高接口的易用性遗嗽,目前已經(jīng)越來越多的web服務(wù)已經(jīng)采用RESTful風(fēng)格的API對外提供服務(wù)粘我,例如:ElasticSearch、MongoDB痹换、Docker等征字。作為一名后臺開發(fā)工程師都弹,我在實際工作中也是以RESTful風(fēng)格指導(dǎo)自己進行接口設(shè)計的過程中,主要會遇到以下兩個問題:

  1. 某些接口無法抽象為資源匙姜,例如:登入接口畅厢、登出接口、搜索接口等氮昧。實際工作中經(jīng)常會遇到這樣的接口:這些接口是針對資源的操作行為框杜,而無法抽象為一種新的資源。ElasticSearch對外提供了非常完善的RESTful風(fēng)格的API郭计,但是針對搜索操作霸琴,用到的URI卻是/index/doc/_search椒振。參照這種方式昭伸,我在工作中如果需要提供類似的接口,也會提供包含動作含義的URI澎迎。

  2. 另一個棘手的問題是RESTful風(fēng)格的API在框架層面不好做監(jiān)控庐杨。通常情況下監(jiān)控為了不侵入業(yè)務(wù)代碼,框架層面記錄每個HTTP請求的URI夹供、方法灵份、返回狀態(tài)碼等信息,然后上報至一個統(tǒng)一的監(jiān)控中心處理分析數(shù)據(jù)哮洽。以查詢雇員信息的API為例填渠,GET /employees/c001GET /employees/c002分別代表查詢c001和c002的信息,業(yè)務(wù)層面上使用了同一份查詢代碼鸟辅,但是監(jiān)控數(shù)據(jù)卻顯示在兩個不同的URI下氛什。目前我們的解決方案是在業(yè)務(wù)層面為每個API配置一條監(jiān)控的URI,這樣GET /employees/c001GET /employees/c002這兩種請求的監(jiān)控都會現(xiàn)在查詢雇員信息API下匪凉,這樣可以更容易反應(yīng)服務(wù)執(zhí)行狀態(tài)枪眉。但是導(dǎo)致的結(jié)果就是工作量的增加,本來在框架層面可以統(tǒng)一處理的邏輯卻要侵入至業(yè)務(wù)代碼再层。

結(jié)論

REST不僅可以對外提供易用方便的API贸铜,同時面向資源的設(shè)計風(fēng)格可以指導(dǎo)數(shù)據(jù)層面上的領(lǐng)域建模,在實際工作中非常值得推薦聂受。但是REST風(fēng)格的API也會帶來一些新的挑戰(zhàn)蒿秦,我們沒必要做一個死板的REST原教旨主語者,應(yīng)該根據(jù)場景蛋济,靈活運用棍鳖,最大程度保證接口定義的清晰明了以及功能的穩(wěn)定正常。

參考資料

[1] 淺談RESTful接口設(shè)計和開發(fā) http://www.reibang.com/p/d674b6153326
[2] 我所理解的RESTful Web API [設(shè)計篇] https://www.cnblogs.com/artech/p/restful-web-api-02.html
[3] Web API 設(shè)計 https://docs.microsoft.com/zh-cn/azure/architecture/best-practices/api-design

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘫俊,一起剝皮案震驚了整個濱河市鹊杖,隨后出現(xiàn)的幾起案子悴灵,更是在濱河造成了極大的恐慌,老刑警劉巖骂蓖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件积瞒,死亡現(xiàn)場離奇詭異,居然都是意外死亡登下,警方通過查閱死者的電腦和手機茫孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來被芳,“玉大人缰贝,你說我怎么就攤上這事∨媳簦” “怎么了剩晴?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侵状。 經(jīng)常有香客問我赞弥,道長,這世上最難降的妖魔是什么趣兄? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任绽左,我火速辦了婚禮,結(jié)果婚禮上艇潭,老公的妹妹穿的比我還像新娘拼窥。我一直安慰自己,他們只是感情好蹋凝,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布鲁纠。 她就那樣靜靜地躺著,像睡著了一般仙粱。 火紅的嫁衣襯著肌膚如雪房交。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天伐割,我揣著相機與錄音候味,去河邊找鬼。 笑死隔心,一個胖子當(dāng)著我的面吹牛白群,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硬霍,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼帜慢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粱玲,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤躬柬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抽减,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體允青,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年卵沉,在試婚紗的時候發(fā)現(xiàn)自己被綠了颠锉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡史汗,死狀恐怖琼掠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情停撞,我是刑警寧澤瓷蛙,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站怜森,受9級特大地震影響速挑,放射性物質(zhì)發(fā)生泄漏谤牡。R本人自食惡果不足惜副硅,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翅萤。 院中可真熱鬧恐疲,春花似錦、人聲如沸套么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胚泌。三九已至省咨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玷室,已是汗流浹背零蓉。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穷缤,地道東北人敌蜂。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像津肛,于是被迫代替她去往敵國和親章喉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349