這次我讓你徹底弄懂 RESTful

2021-02-18 Hollis

RESTful 想必大家都耳熟能詳。

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

為什麼稱之為 RESTful 架構?

我不用 RESTful 不行嗎?

什麼樣才叫真正的 RESTful ?

其實網上 RESTful 的文章有挺多的,不過有些講的糊裡糊塗的,而且很大部分都忽略了 HATEOAS。

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

當時我人都傻了。

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

其實有很多人也稀裡糊塗的,也包括我自己。

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

而且我之前還特不能理解,為啥這叫架構?

我特意搜索了下架構的解釋。

軟體架構是有關軟體整體結構與組件的抽象描述,用於指導大型軟體系統各個方面的設計。

整體結構與組件的抽象描述。

RESTful 哪有什麼組件和結構之間的玩意?

所以就至今我寫下這篇文章的時候我也理解不了為什麼叫 RESTful 架構。

可能是我對架構的理解太狹隘,還不到火候。

我個人只能理解成 RESTful 風格的 API 設計,也就是說 RESTful 只是一種指導風格,就像我們 Java 要用駝峰命名法。

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

當然能跑,這只是一種希望大家都能遵循的規範。

對 RESTful 而言我覺得算不上規範,只能說指導風格。

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

REST

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

直譯過來就是表述性狀態轉移。

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

從提出 REST 的論文中我翻了翻,沒有明說但是表達的意思是其實它還有個主語 Resource 。

所以是資源的表述性狀態轉移。

稍微可以理解一點了。

我們先不管什麼狀態轉移,大致先有點感覺。

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

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

REST 的核心

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

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

這些動詞都是有含義的。

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

PUT 指的是修改資源,是冪等的。

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

所以根據這些規範我們都能得知這次交互的一些動作,所以 RESTful 風格正確的使用姿勢如下:

比如獲取一個 user。

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

正確姿勢:GET /users/1。

再比如新增 user。

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

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

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

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

其實更深一步的理解是  HTTP 是一個協議。

協議其實就是約定好的一個東西,協議就規定 GET 是獲取資源,那你非得在 URL 上再重複一遍或者所有請求不論增刪改都用 GET 這個動作,這其實就是沒有完全遵循這個協議。

可以說只是把 HTTP 當成一個傳輸管道,而不是約定好的協議。

這其實是對 HTTP 更深一層的認識,我認為也是 RESTful 被推出的原因。

當然理想很豐滿,現實很骨感,還是有很多人就 getUserById。

不過我個人覺得問題不大,公司統一就行。

HATEOAS

即 Hypermedia as the Engine of Application State 的縮寫,翻譯過來就是作為應用狀態引擎的超媒體。

這也是 REST 提出的設計。

是不是理解不了?其實很簡單。

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

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

GET /users
Accept: application/json+userdb

此時的返回應該是:

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,結果會返回你能對這個資源所做的操作。

比如對於 userId 是 1 的,你調用PUT /user/1就是做修改這個用戶,DELETE /user/1就是刪除這個用戶。

最外層的 links 告訴你用 POST /user 就能再創建一個用戶。

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

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

它也不需要管具體怎麼做,反正返回裡面會告訴它 DELETE 就這樣這樣,POST 就這樣這樣。

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

然後這個時候再去理解下資源的表述性狀態轉移,是不是感覺來了?

如果說上一 part 提到用 HTTP 的動詞來指代動作, URL 僅表示資源的現實是骨感的。

那麼 HATEOAS 的現實就是骨灰。

基本上沒幾家公司會這麼做。

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

它的出發點是讓客戶端從響應就能得知對資源操作的入口,並且通過響應得知哪些動作能執行。

聽起來好像有點用,但是就我目前的功力,我只能看到響應變得十分冗餘。

最後

這篇文章關於 RESTful API 具體的寫法我就提到一些,還有挺多的就自己查資料吧。

文章的目的是為了讓你理解 RESTful API,我再總結一下重點。

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

所以協議約定了很多東西,推薦我們按照協議的用法進行客戶端和服務端的交互。

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

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

RESTful 是一種風格,你是否採用這種風格對你的程序運行沒有影響,類比駝峰命名來思考。

簡而言之,RESTful 就是不要在 URL 上表現出動作,用 HTTP 動詞代表動作,URL 上只做資源。

僅此而已。

至於要不要嚴格遵循 RESTful 風格,我個人的看法是公司內部保持一致就行。

巨人的肩膀https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2http://www.ruanyifeng.com/blog/2011/09/restful.htmlhttps://stackoverflow.com/questions/671118/what-exactly-is-restful-programming/3950863#3950863https://en.wikipedia.org/wiki/HATEOAS

有道無術,術可成;有術無道,止於術

歡迎大家關注Java之道公眾號


好文章,我在看❤️

相關焦點

  • 這一次,徹底弄懂 JavaScript 執行機制
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文的目的就是要保證你徹底弄懂JavaScript的執行機制,如果讀完本文還不懂,可以揍我。
  • 10個人9個錯,這次終於弄懂了
    10個人9個錯,這次終於弄懂了。對於我們現在的社會來說,生活水平還真的是提高了不少呀,而且對於在日常生活當中吃的東西也是變得越來越多,所以不少的人他們也都是特別喜歡把一些幹米粉買回家之後泡一泡就可以煮著吃的,而且也是要比外面買回來的更加便宜,所以配菜什麼的也都是自己可以在家裡面進行選擇,而且對於做法來說也是乾淨,衛生又好吃,不過問題也就來了,泡幹米粉的時候到底是用熱開水還是冷水呢?
  • 塔羅:這次分手真的徹底斷了嗎?不會的,他怎麼會這麼狠心忘了我
    今天我們就直奔主題,你們的感情總是分分合合,這次分手是不是真的就徹底斷了?答案就交給我們今天的塔羅牌吧,塔羅牌測試規則:平靜你的心情,默念今天的測試問題,我們這次分手就真的徹底斷了嗎?再沒有複合的機會了嗎?然後憑你第一感覺在下面abcd當中選一張牌,每一張牌對應了一張塔羅牌,選好之後看後面的結果。
  • 塔羅:這次分手真的徹底斷了嗎?不會的,他不會這麼狠心的忘了我
    今天我們就直奔主題,你們的感情總是分分合合,這次分手是不是真的就徹底斷了?答案就交給我們今天的塔羅牌吧,塔羅牌測試規則:平靜你的心情,默念今天的測試問題,我們這次分手就真的徹底斷了嗎?再沒有複合的機會了嗎?然後憑你第一感覺在下面abcd當中選一張牌,每一張牌對應了一張塔羅牌,選好之後看後面的結果。
  • 如何設計restful風格接口
    restful風格接口URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。識別(identify)、 表示(represent) 、交互(interact with)。看Url就知道要什麼看http method就知道幹什麼看http status code就知道結果如何1.
  • 「請家長幫助孩子弄懂錯題!」「老師,你怎麼可以這樣?」
    一位家長在網上發了一幅微信截圖,是一位老師發在家長群裡的內容,因為考試成績出來了,試捲髮下去了,請家長幫助學生弄懂錯題。家長對此很不以為然,覺得弄懂錯題不該是家長的事情,而是老師的事情。3、家長有點玻璃心敏感過度老師請家長幫助孩子弄懂錯題,沒毛病。弄懂錯題是老師的責任,但是因為家學生回家了,老師能追著到你家裡去幫助嗎,再說43個學生有42個學生試卷上有錯,老師能分身到42家去嗎?家長幫助學生弄懂,沒有什麼不可以。
  • 這口惡氣川普憋了很久 這次終於徹底放開了
    但這次美國媒體都驚呆了,川普真是徹底放開了,要知道,這是他迄今發表的最長一次演講,沒有之一。用一位網友的話說,這是美國頂級版的「吐槽大會」,而且是單口。川普心中有氣啊,老子都忍了一個多禮拜了,你們都退下,我先罵。周六是怎麼罵的呢?譬如,頭號目標,估計就是特別檢察官米勒。
  • 這次,你刪了我,以後真的不再添加你了
    真正愛你的人,總會時常惦記著你。而當你遇到真愛時,你會很在意她的感受,你在她心中的地位。但是,抱歉!我已經不能堅持去愛你了,也沒耐心去猜測你的心意。因為對你的愛,我已經感覺到很累了,如果再繼續愛下去,只會傷得更深、更徹底。
  • RESTful API 最佳實踐(阮一峰)
    查詢字符串的寫法明顯更好。作者:阮一峰http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html看懂英文技術文檔,每天只需要10分鐘做這件事
  • 用圖文帶你徹底弄懂GDB調試原理
    相信每位嵌入式開發工程師都使用過gdb來調試程序,如果你說沒有用過,那只能說明你的開發經歷還不夠坎坷,還需要繼續被 BUG吊打。我們都知道,在使用gcc編譯時,可以使用-g選項在可執行文件中嵌入更多的調試信息,那麼具體嵌入了哪些調試信息?這些調試信息是如何與二進位的指令之間進行相互交互?
  • 4.13我放棄你了,徹底的
    我不是不找你了,我怕你笑話我離不開你,我向來孤獨成性卻愛你好深。一座城市在喧鬧沒有你便是空城。後來我所遇之人,都勝你,但所愛的程度都不及你。明明是你突然闖進我的世界裡,最後卻是我哭著求你別離開。你是我喪失愛人的能力後最後愛上的人,我沒能力再愛別人了。
  • 就事論事,對事不對人,你需要先弄懂自己
    我想了好久,在每晚的夜讀中,才有了自己的一些想法,也找到了一些答案。到底對事不對人,還是由人及事。我們通常會宣稱遵守一個原則——就事論事。我們論事不論人,不把情緒放入考慮因素中。比如,這件事情如果沒有處理好,我們不會糾結某個人的情緒,而是只針對事情本身,討論出一個可行的解決方案。然而,現實生活中這一點是很難實現的,因為只要是人就會有情緒。
  • 張正隆:毛主席搞文革是因他也沒弄懂馬列
    【先鋒語錄】★我是個軍人,在戰場上我可以為國家獻身,搞對象時候我可以為媳婦獻身。有些事情需要你為它獻出一切,你就得幹。★直到現在,總有人想掩蓋一些東西,時間越久,歷史上蒙蔽的灰塵越多。A:所以我就玩命地跑啊跑啊,很多都是我自費地跑啊。我就說,東北抗聯是文學的富礦,你鑽進去,越走越遠越走越遠,你覺得那裡面有十八般武藝,你小子沒能耐,要是有能耐,多大勁兒都能使出來。所以我說,誰也不要耽誤我時間,誰也別來打擾我,我在《槍桿子》的序裡寫,死了以後我就像賓館房間那樣,在墓碑掛上「請勿打擾」,別來騷擾我,我就捨不得這時間。
  • 教你弄懂「奇怪」的澳洲英語
    新東方網>英語>英語學習>口語>實用口語>正文教你弄懂「奇怪」的澳洲英語 2012-12-27 20:21 來源:騰訊教育 作者:
  • 莉三萬公然挑釁國威,這次徹底涼涼,網友:這都是活該!
    之前陳凱莉在抖音上一首另類腔調《讓我做你的眼鏡》而火遍大家的心中,一下子漲粉無數。可以說陳凱莉在抖音是新一屆的網紅呢,也是抖音上漲粉最快的呢。不過,人紅是非多這話說的確實沒有錯呢。之後的莉三萬就開始走上了黑歷史的巔峰了,一系列的黑料被曝出,尤其是她插足別人的戀情,做小三等等。本來大家都以為莉哥這次應該會很久都不敢出來直播了吧,結果她在抖音的帳號被封了之後歐,如今轉型到虎牙直播間了。
  • 函谷關之行,使我真正弄懂了紫氣東來的原由
    函谷關之行,使我真正弄懂了紫氣東來的原由和一夫當關,萬夫莫開的成語。函谷關是我國歷史上建置最早的雄關要塞之一,因關在谷中,深險如函,故稱函谷關。函谷關始建於西周時期,是我國歷史上建制最早的雄關要塞之一。
  • 好多人不知道,弄懂都是高手
    好多人不知道,弄懂針對靠譜的借貸平-臺而言,都做得十分嚴謹,對你的審批肯定是要求做到細緻入微,因為靠譜的借貸平-臺是肯定要對你開展一系列的風險控制調查,保證你有還貸能力或抵押物才會下款。而針對大型靠譜的借貸平-臺而言,消費者的信息是不容易隨便洩漏的。即使有也僅僅是他們企業別的不同的產品推薦而已。畢竟肥水不流外人田嘛。
  • 人參分類詳解,讓你徹底弄懂人參如何分類
    我們講過好多次人參的分類,但是這次,小編決定寫一份最完整,最詳細,最容易看懂的人參分類。
  • 杜特爾特開門見山,美國這次或要徹底失望了
    02杜特爾特開門見山,美國這次或要徹底失望了此次,杜特爾特開門見山,向中國表達善意的舉動,足以看出中國在世界上的地位正在日漸上升。美國這次恐怕要徹底失望了!值得關注的是,菲律賓政府正和中國科興公司協商採購該公司研發的新冠疫苗。
  • 這次網絡「人肉」徹底失效了???
    而我納悶的不是熱搜問題,歷來戰無不勝的網絡「人肉」能力,這次人肉留學女父母之際,好像突然全部集體「陣亡」無能了曾幾何時,網絡要想人肉一個人,幾乎刷新一下就能看到下文了……而這次這次