這次我讓你徹底弄懂 RESTful

RESTful 想必大家都耳熟能詳尾膊。

但是為什么要有 RESTful,RESTful 到底是什么意思。

為什么稱之為 RESTful 架構(gòu)斑鸦?

我不用 RESTful 不行嗎?

什么樣才叫真正的 RESTful 草雕?

其實網(wǎng)上 RESTful 的文章有挺多的巷屿,不過有些講的糊里糊涂的,而且很大部分都忽略了 HATEOAS墩虹。

在之前的面試中面試官就問過我嘱巾,你怎么理解 RESTful 的憨琳,英文全稱是啥?為什么叫這個名字?

當(dāng)時我人都傻了旬昭。

面試官不講武德篙螟,針對我這個剛出社會的小伙子。

其實有很多人也稀里糊涂的问拘,也包括我自己遍略。

就面向資源唄,不加動詞咯骤坐,還能咋滴绪杏,我加動詞不也能用嗎?

而且我之前還特不能理解纽绍,為啥這叫架構(gòu)蕾久?

我特意搜索了下架構(gòu)的解釋。

軟件架構(gòu)是有關(guān)軟件整體結(jié)構(gòu)與組件的抽象描述拌夏,用于指導(dǎo)大型軟件系統(tǒng)各個方面的設(shè)計僧著。

整體結(jié)構(gòu)與組件的抽象描述

RESTful 哪有什么組件和結(jié)構(gòu)之間的玩意障簿?

所以就至今我寫下這篇文章的時候我也理解不了為什么叫 RESTful 架構(gòu)盹愚。

可能是我對架構(gòu)的理解太狹隘,還不到火候站故。

我個人只能理解成 RESTful 風(fēng)格的 API 設(shè)計杯拐,也就是說 RESTful 只是一種指導(dǎo)風(fēng)格,就像我們 Java 要用駝峰命名法世蔗。

那不用駝峰命名法代碼就不能跑了嗎端逼?

當(dāng)然能跑,這只是一種希望大家都能遵循的規(guī)范污淋。

對 RESTful 而言我覺得算不上規(guī)范顶滩,只能說指導(dǎo)風(fēng)格。

來讓我們正式的進入對 RESTful 的剖析寸爆。

REST

REST 不是一個單詞礁鲁,是 Representational State Transfer 的縮寫。

直譯過來就是表述性狀態(tài)轉(zhuǎn)移赁豆。

我對這個名字蒙了一年多仅醇,就不能說點能聽得懂的嘛。

從提出 REST 的論文中我翻了翻魔种,沒有明說但是表達(dá)的意思是其實它還有個主語 Resource 析二。

所以是資源的表述性狀態(tài)轉(zhuǎn)移

稍微可以理解一點了。

我們先不管什么狀態(tài)轉(zhuǎn)移叶摄,大致先有點感覺属韧。

知道 REST 之后 RESTful 就不難解釋了,加 ful 就是變形容詞了蛤吓,比如 wonderful girl宵喂。

至此對名字稍微解釋了一下,疑惑還在沒事会傲,咱們慢慢理锅棕。

REST 的核心

核心就是資源,用 URL 定位資源淌山,用 HTTP 動詞來描述所要做的操作裸燎。

HTTP的提供了很多動詞:GET、PUT艾岂、POST顺少、DELETE......

這些動詞都是有含義的朋其。

比如 GET 就是獲取資源王浴,是查詢請求。

PUT 指的是修改資源梅猿,是冪等的氓辣。

POST 也是修改(新增也是一種修改),指的是不冪等的操作袱蚓。

所以根據(jù)這些規(guī)范我們都能得知這次交互的一些動作钞啸,所以正確的使用姿勢如下:

比如獲取一個 user。

錯誤姿勢:GET /getUserById?userId=1喇潘。

正確姿勢:GET /users/1体斩。

再比如新增 user。

錯誤姿勢:POST /addUser (省略body)颖低。

正確姿勢:POST /users (省略body)絮吵。

可以看到 HTTP 的動詞其實就能指代你要對資源做的操作,所以不需要在 URL 上做一些東西忱屑,就把 URL 表明的東西就看做一個資源即可蹬敲。

這里注意要用對 HTTP 動詞,比如一個獲取資源的請求用 PUT莺戒,用了也能獲取資源但是這不合適伴嗡。

其實更深一步的理解是 HTTP 是一個協(xié)議。

協(xié)議其實就是約定好的一個東西从铲,協(xié)議就規(guī)定 GET 是獲取資源瘪校,那你非得在 URL 上再重復(fù)一遍或者所有請求不論增刪改都用 GET 這個動作,這其實就是沒有完全遵循這個協(xié)議名段。

可以說只是把 HTTP 當(dāng)成一個傳輸管道渣淤,而不是約定好的協(xié)議赏寇。

這其實是對 HTTP 更深一層的認(rèn)識,我認(rèn)為也是 RESTful 被推出的原因价认。

當(dāng)然理想很豐滿嗅定,現(xiàn)實很骨感,還是有很多人就 getUserById用踩。

不過我個人覺得問題不大渠退,公司統(tǒng)一就行。

HATEOAS

即 Hypermedia as the Engine of Application State 的縮寫脐彩,翻譯過來就是作為應(yīng)用狀態(tài)引擎的超媒體碎乃。

這也是 REST 提出的設(shè)計。

是不是理解不了惠奸?其實很簡單梅誓。

例子我就不自己編了,抄一下 stackoverflow 回答上的例子佛南。

比如你請求獲取用戶列表:

GET /users
Accept: application/json+userdb

此時的返回應(yīng)該是:

200 OK
Content-Type: application/json+userdb

{
    "users": [
        {
            "id": 1,
            "name": "Emil",
            "country: "Sweden",
            "links": [
                {
                    "href": "/user/1",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/1",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/1",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        },
        {
            "id": 2,
           ....省略.....
        }
    ],
    "links": [
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

重點就是這個 links梗掰,結(jié)果會返回你能對這個資源所做的操作。

比如對于 userId 是 1 的嗅回,你調(diào)用PUT /user/1就是做修改這個用戶及穗,DELETE /user/1就是刪除這個用戶。

最外層的 links 告訴你用 POST /user 就能再創(chuàng)建一個用戶绵载。

這里還有個隱藏信息埂陆,可能看到外層的 links 沒有返回 DELETE 的信息,說明此時客戶端無法刪除用戶娃豹!

所以說 RESTful API 還需要在返回此時能做資源所做的操作焚虱,這樣客戶端就知道它能做什么。

它也不需要管具體怎么做懂版,反正返回里面會告訴它 DELETE 就這樣這樣鹃栽,POST 就這樣這樣。

沒告訴它的就是不能做的定续。

然后這個時候再去理解下資源的表述性狀態(tài)轉(zhuǎn)移谍咆,是不是感覺來了?

如果說上一 part 提到用 HTTP 的動詞來指代動作私股, URL 僅表示資源的現(xiàn)實是骨感的摹察。

那么 HATEOAS 的現(xiàn)實就是灰。

基本上沒幾家公司會這么做倡鲸。

就我個人而言這玩意沒啥用张抄。

它的出發(fā)點是讓客戶端從響應(yīng)就能得知對資源操作的入口闽坡,并且通過響應(yīng)就得知哪些動作能執(zhí)行账嚎。

聽起來好像有點用,但是就我目前的功力逼争,我只能看到響應(yīng)變得十分冗余。

最后

這篇文章關(guān)于 RESTful API 具體的寫法我就提到一些劝赔,還有挺多的就自己查資料吧誓焦。

文章的目的是為了讓你理解 RESTful API,我再總結(jié)一下重點着帽。

HTTP 是協(xié)議杂伟,不是傳輸通道。(對協(xié)議不理解的看我之前的 HTTP 分析)

所以協(xié)議約定了很多東西仍翰,推薦我們按照協(xié)議的用法進行客戶端和服務(wù)端的交互赫粥。

也就是 RESTful 表明的面向資源,通過 HTTP 動作 + URL 上的資源予借。

RESTful 還提到了 HATEOAS越平,雖說基本上沒什么公司會這樣使用,但是它能讓你更好的理解 REST 這個名字的含義灵迫。

RESTful 是一種風(fēng)格秦叛,你是否采用這種風(fēng)格對你的程序運行沒有影響,類比駝峰命名來思考龟再。

簡而言之书闸,就是不要在 URL 上表現(xiàn)出動作尼变,用 HTTP 動詞代表動作利凑,URL 上只做資源,僅此而已嫌术。

至于要不要嚴(yán)格遵循 RESTful 風(fēng)格哀澈,我個人的看法是公司內(nèi)部保持一致就行

歡迎加我好友進行深入地交流度气,備注「進群」割按,拉你進交流&內(nèi)推群。

平日的面試題遇到難處磷籍,或者看某個知識點翻遍全網(wǎng)的資料還是感覺很模糊适荣、不透徹,可以私聊我院领,給我留言弛矛。

遇到合適的我會整理寫出一篇文章,注意這個前提我認(rèn)為合適的比然。

那種工作遇到很細(xì)節(jié)的場景的還是別了丈氓,這種問你上司比較合適:)。

巨人的肩膀

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2

http://www.ruanyifeng.com/blog/2011/09/restful.html

https://stackoverflow.com/questions/671118/what-exactly-is-restful-programming/3950863#3950863

https://en.wikipedia.org/wiki/HATEOAS


我是 yes,從一點點到億點點万俗,歡迎在看湾笛、轉(zhuǎn)發(fā)、留言闰歪,我們下篇見嚎研。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市库倘,隨后出現(xiàn)的幾起案子嘉赎,更是在濱河造成了極大的恐慌,老刑警劉巖于樟,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件公条,死亡現(xiàn)場離奇詭異,居然都是意外死亡迂曲,警方通過查閱死者的電腦和手機靶橱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來路捧,“玉大人关霸,你說我怎么就攤上這事〗苌ǎ” “怎么了队寇?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長章姓。 經(jīng)常有香客問我佳遣,道長,這世上最難降的妖魔是什么凡伊? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任零渐,我火速辦了婚禮,結(jié)果婚禮上系忙,老公的妹妹穿的比我還像新娘诵盼。我一直安慰自己,他們只是感情好银还,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布风宁。 她就那樣靜靜地躺著,像睡著了一般蛹疯。 火紅的嫁衣襯著肌膚如雪戒财。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天苍苞,我揣著相機與錄音固翰,去河邊找鬼狼纬。 笑死,一個胖子當(dāng)著我的面吹牛骂际,可吹牛的內(nèi)容都是我干的疗琉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼歉铝,長吁一口氣:“原來是場噩夢啊……” “哼盈简!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起太示,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柠贤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后类缤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼勉,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年餐弱,在試婚紗的時候發(fā)現(xiàn)自己被綠了宴霸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡膏蚓,死狀恐怖瓢谢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驮瞧,我是刑警寧澤氓扛,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站论笔,受9級特大地震影響采郎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翅楼,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一尉剩、第九天 我趴在偏房一處隱蔽的房頂上張望真慢。 院中可真熱鬧毅臊,春花似錦、人聲如沸黑界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朗鸠。三九已至蚯撩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烛占,已是汗流浹背胎挎。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工沟启, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犹菇。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓德迹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揭芍。 傳聞我的和親對象是個殘疾皇子胳搞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容