rest和rest ful_为什么REST如此重要
rest和rest ful
這篇文章致力于REST,一種塑造Web服務(wù)的架構(gòu)風(fēng)格,以及IT歷史上最容易被誤解的概念。 這篇文章針對的是正在設(shè)計Web服務(wù)api的人,他們沒有完全了解REST的實際含義。 我想給你個主意。 這篇文章也發(fā)給了那些想知道REST意味著什么的人,而實際上您還沒有任何線索。 是的,我過去遇到過這樣的人-很多人。 它沒有涉及Richardson成熟度模型的細(xì)節(jié),也不會使您成為REST專家。 網(wǎng)路上有許多相關(guān)的指南:幻燈片,youtube視頻,博客文章,書籍等等。 而不是進(jìn)入細(xì)節(jié),我將在本文結(jié)尾處鏈接一些良好的資源。
因此,讓我們開始
REST的含義
代表性國家轉(zhuǎn)移。 這句話不僅是REST所代表的意思,還是對REST實際含義的最細(xì)微的描述。 沒聽懂嗎? 再次閱讀:代表性狀態(tài)轉(zhuǎn)移。 它不是一個標(biāo)準(zhǔn),而是一種通過其表示來描述轉(zhuǎn)移某種狀態(tài)的行為的方式。
讓我們考慮一下:
馬庫斯是一位農(nóng)民。 他的牧場有4頭豬,12頭雞和3頭牛。 我現(xiàn)在是客戶端時,他現(xiàn)在正在模擬REST api。 如果我想使用REST請求他的農(nóng)場的當(dāng)前狀態(tài),我只是問他:“狀態(tài)?”
馬庫斯回答:“ 4頭豬,12只雞,3頭牛”。 這是代表性狀態(tài)轉(zhuǎn)移的最簡單示例。 馬庫斯(Marcus)通過代理將農(nóng)場的狀況移交給了我。 農(nóng)場的表達(dá)很簡單:“ 4頭豬,12只雞,3頭牛”。
因此,讓我們進(jìn)入一個新的水平。 我如何告訴馬庫斯以REST方式向他的農(nóng)場增加2頭奶牛?
也許告訴他:“馬庫斯,請在您的農(nóng)場增加2頭母牛。”
您認(rèn)為這是REST嗎? 我們在這里通過狀態(tài)表示來轉(zhuǎn)移狀態(tài)嗎? 沒有! 這被稱為遠(yuǎn)程過程。 向場中添加2頭母牛的過程。 馬庫斯遺憾地回答:“ 400,錯誤請求。 你什么意思?” 因此,讓我們再試一次。 我們將如何以REST方式做到這一點(diǎn)? 代表又是什么? 那是“ 4頭豬,12只雞,3頭牛”。 好。 因此,讓我們再次嘗試轉(zhuǎn)移表示形式... 我:“馬庫斯,……四頭豬,十二只雞, 請給5頭牛!”。 馬庫斯:“好!”。 我:“馬庫斯,……您現(xiàn)在的狀態(tài)是什么?”。 馬庫斯:“四頭豬,十二只雞,五頭牛”。 我:“啊,太好了!” 看到? 其實并不難,它是REST。
為什么RPC是A **的痛處
那么,從邏輯的角度來看,為什么您會偏愛REST而不是遠(yuǎn)程過程調(diào)用(= RPC)? 因為它使代表成為我們的唯一合同,大大降低了我們溝通的復(fù)雜性。 我們不必討論我們需要什么樣的程序(添加一頭牛?,添加某種類型的動物?將雞的數(shù)量加倍?移除所有的豬?)。 我們需要討論的只是表示形式,并使用該表示形式來實現(xiàn)我們想要的任何東西。 很簡單,不是嗎? 不必要的RPC復(fù)雜性根本沒有幫助。 這反而增加了誤解的風(fēng)險,這是我們不希望的。 我們不希望我們的溝通失敗,因為我和馬庫斯對程序的理解不同。
但這只是RPC正在創(chuàng)建的許多問題之一。 如果要使用RPC,則需要設(shè)計某種結(jié)構(gòu)以將過程嵌入其中。 此結(jié)構(gòu)需要一個用于存儲參數(shù),錯誤代碼,返回值等的位置。 我見過很多真正做到這一點(diǎn)的開發(fā)商和公司。 他們設(shè)計了自己的RPC結(jié)構(gòu),在實現(xiàn)客戶端和客戶端-服務(wù)器交互時出現(xiàn)了巨大的問題。 你為什么要這樣做? 為什么要發(fā)明自己的RPC結(jié)構(gòu)? 您認(rèn)為這有幫助嗎? 如果我想制作一個使用多種專有RPC格式的許多Web服務(wù)的應(yīng)用程序怎么辦? 我將不得不開發(fā)這樣的東西:
啊…
如果您確實需要RPC,請至少選擇SOAP之類的標(biāo)準(zhǔn)。 不要編自己的東西!
但是SOAP仍然很糟糕
但是,即使RPC的標(biāo)準(zhǔn)也確實很痛苦。 好吧,我必須承認(rèn),使用ACID Transactions和完整的標(biāo)準(zhǔn)化服務(wù)描述語言,在某些情況下SOAP并不是很糟糕。 但是,SOAP產(chǎn)生的開銷巨大且是巨大的性能殺手。 HTTP是輕量級協(xié)議。 它的標(biāo)題包括您需要的任何內(nèi)容。 您想要放入體內(nèi)的唯一東西是一種表示形式,或者甚至沒有。
會話是邪惡的
您不需要會話! 有人可能會說:“但是我想保存顧客的購物車,所以我需要那次會議!” –不,很不對! 您無需會話即可做任何您想做的事情。 您可以將購物車的信息封裝在URI中,甚至可以為該購物車創(chuàng)建另一個資源,例如“ / carts / 5235”。
在兩個請求之間,您希望能夠關(guān)閉服務(wù)器,卸載其平臺和操作系統(tǒng),拆卸服務(wù)器硬件,重新組裝服務(wù)器,重新安裝其操作系統(tǒng),平臺和應(yīng)用程序以及還原備份,而客戶端甚至不會注意到。
不要強(qiáng)迫瀏覽器(例如智能手機(jī))以外的客戶端存儲cookie。 這是不必要的復(fù)雜性,我向您保證,這會引起問題。 您甚至應(yīng)該考慮從Web應(yīng)用程序中刪除有狀態(tài)。
不要重塑超媒體
既然超媒體現(xiàn)在變得非常流行,我求你:不要發(fā)明自己的風(fēng)格。
我們已經(jīng)有很多。 有
- 通過Atom Link規(guī)范的超媒體,例如spring-hateoas和spring-data-rest中的 。
- JSON-HAL
- JSON-LD
- …
我們正在慢慢地再次達(dá)到這一點(diǎn):
更多資源
在本文中,我僅涉及REST的優(yōu)點(diǎn)。
這里有一些很好的資源,可以使您加深了解。
- 關(guān)于理查森成熟度模型的福勒斯文章
- 超媒體的絕佳幻燈片
- David Zuelke關(guān)于RESTful Web服務(wù)的演講
- REST簡介(GoogleDevelopers的短片)
- 萊茲·哈茲伍德(Stormpath)的談話
- RESTful WebService的食譜
- 關(guān)于REST的偉大的德國書
翻譯自: https://www.javacodegeeks.com/2013/08/why-rest-is-so-important.html
rest和rest ful
總結(jié)
以上是生活随笔為你收集整理的rest和rest ful_为什么REST如此重要的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Docker容器中的Tomcat上运行
- 下一篇: 农业备案立项流程(农业备案立项)