大家好昧谊,我是IT修真院深圳分院java第4期學員刽虹,一枚正直善良的java程序員。今天給大家分享一下呢诬,修真院官網(wǎng)java任務二關于restful自己的一點理解涌哲。
1.背景介紹
restful風格,就是一種面向資源服務的API設計方式尚镰,它不是規(guī)范阀圾,不是標準,它一種設計模式狗唉。
REST -- REpresentational State Transfer 直接翻譯:表現(xiàn)層狀態(tài)轉(zhuǎn)移初烘。
用一句話來描述就是:
URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。
2.知識剖析
REST是一種軟件架構(gòu)模式肾筐。核心概念包括:
資源(Resource):在REST中哆料,資源可以簡單的理解為URI,表示一個網(wǎng)絡實體吗铐。
比如东亦,/users/1/name,對應id=1的用戶的屬性name抓歼。
表現(xiàn)(Representation):是資源呈現(xiàn)出來的形式讥此,比如上述URI返回的HTML或JSON,包括HTTP Header等谣妻;
既然資源是URI萄喳,就會具有以下特征:名詞,代表一個資源蹋半;它對應唯一的一個資源他巨,是資源的地址。
為什么使用rest减江?
我們平時搞系統(tǒng)是這樣的:
1.有新建用戶功能
2.新建用戶需要一個URL
3.往這個URL發(fā)送的數(shù)據(jù)要定義好
4.開始寫后端和前端
這是以操作為第一位的設計方法染突,首先我們確認了一個操作,然后圍繞這個操作把
周邊需要的東西建設好辈灼,這種方式當然可以架構(gòu)出一個系統(tǒng)份企,甚至是一個好系統(tǒng)。
出現(xiàn)的問題:
1.操作之間是會有關聯(lián)巡莹,你的設計容易變成“第2個操作要求第1個操作進行過”司志,這種關系多起來你的系統(tǒng)就亂了
2.你的URL設計會缺乏一致性
3.操作通常被認為是有副作用(Side Effect)的,所以很少有人基于操作去設計緩存之類的東西
基于這些問題降宅,我們的另一種方法是基于資源的角度來搞:
1.各個資源雖然可能有關聯(lián)骂远,但依舊是能夠簡單地切掉這些關聯(lián)導致相互獨立的,所以不會有非常亂的耦合性
2.對資源的操作就這么幾種腰根,所以很容易設計一致的URL
3.我們明白對資源的讀操作是無副作用的激才,所以能玩緩存
rest的優(yōu)勢和優(yōu)點:
首先,REST規(guī)范:
1.強調(diào)HTTP應當以資源為中心额嘿,并且規(guī)范了資源URI的風格瘸恼;
2.規(guī)范了HTTP請求動作(PUT,POST等)的使用岩睁,具有對應的語義钞脂;
遵循REST規(guī)范的Web應用將會獲得下面好處:
1.URL具有很強可讀性的,具有自描述性捕儒;
2.資源描述與視圖的松耦合冰啃;
3.可提供OpenAPI邓夕,便于第三方系統(tǒng)集成,提高互操作性阎毅;
4.如果提供無狀態(tài)的服務接口焚刚,可提高應用的水平擴展性;
get扇调、put矿咕、post、delete含義與區(qū)別:
1狼钮、GET請求會向數(shù)據(jù)庫發(fā)索取數(shù)據(jù)的請求碳柱,從而來獲取信息,該請求就像數(shù)據(jù)庫的select操作一樣熬芜,
只是用來查詢一下數(shù)據(jù)莲镣,不會修改、增加數(shù)據(jù)涎拉,不會影響資源的內(nèi)容瑞侮,即該請求不會產(chǎn)生副作用。
無論進行多少次操作鼓拧,結(jié)果都是一樣的半火。
2、與GET不同的是季俩,PUT請求是向服務器端發(fā)送數(shù)據(jù)的钮糖,從而改變信息,該請求就像數(shù)據(jù)庫的update
操作一樣酌住,用來修改數(shù)據(jù)的內(nèi)容藐鹤,但是不會增加數(shù)據(jù)的種類等,也就是說無論進行多少次PUT操作赂韵,其結(jié)果并沒有不同。
3挠蛉、POST請求同PUT請求類似祭示,都是向服務器端發(fā)送數(shù)據(jù)的,但是該請求會改變數(shù)據(jù)的種類等資源谴古,
就像數(shù)據(jù)庫的insert操作一樣质涛,會創(chuàng)建新的內(nèi)容。幾乎目前所有的提交操作都是用POST請求的掰担。
4汇陆、DELETE請求顧名思義,就是用來刪除某一個資源的带饱,該請求就像數(shù)據(jù)庫的delete操作。
3.常見問題
html表單form中轧叽,method沒有put枯途、delete?
4.解決方案
1.在 web.xml 中配置 HiddenHttpMethodFilter 過濾器
2.編寫表單模擬 PUT 和 DELETE
方式提交說明: PUT 和 DELETE 方式 捏鱼,在寫表單提交的時候還是發(fā)送 post 請求,
但是要附加一個隱藏的文本域酪耕,name 的值固定為 “_method”导梆,value 寫 “PUT” 或者 “DELETE”。
3.編寫控制器
5.編碼實戰(zhàn)
迂烁。看尼。。
6.擴展思考
對于用戶登錄和用戶退出這兩個業(yè)務需求盟步,REST指導下的架構(gòu)和設計如何滿足藏斩?
a.把“登錄”作為一個資源,所以登錄是POST /logins址芯,退出是DELETE /logins灾茁。
b.對應于Authentication的POST和DELETE,一般在移動端也就是Token的POST和DELETE
c.至于Login和Logout到底是資源還是操作谷炸?我認為是User這個資源的狀態(tài)的變更北专。
當然,『登錄』這個概念已經(jīng)是一個歷史名詞了旬陡,現(xiàn)代的用戶系統(tǒng)拓颓,都只有『申請/發(fā)放令牌』的操作。讓用戶通過令牌來完成驗證和鑒權(quán)描孟,而非通過『登錄』來改變系統(tǒng)中的用戶狀態(tài)驶睦。
7.參考文獻
參考一:http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架構(gòu)
參考二:http://blog.csdn.net/programmer_sir/article/details/51592433 Restful風格到底是什么?怎么應用到我們的項目中匿醒?
8.更多討論
1.hidenhttpmethodfilter有什么特性场航?
瀏覽器form表單只支持GET與POST請求,而DELETE廉羔、PUT等method并不支持溉痢,spring3.0添加了一個過濾器,可以將這些請求轉(zhuǎn)換為標準的http方法憋他,使得支持GET孩饼、POST、PUT與DELETE請求竹挡,該過濾器為HiddenHttpMethodFilter镀娶。
2.設計rest風格的api的時候,盡可能使用http協(xié)議中已有的東西來實現(xiàn)揪罕,這樣做的目的是什么梯码?
對資源的操作就這么幾種宝泵,所以很容易設計一致的URL。
對uri進行了限制忍些,只用于定義資源鲁猩。這樣看起來比較容易理解。
尤其是對簡單的對象的增刪改查罢坝,很好理解廓握。
3.restful中如果delete多個數(shù)據(jù)的時候怎么組織uri?
簡單的說嘁酿,下面幾種都不錯:
GET /ec2/instance/batch?id=aa,bb,cc:簡約的設計
GET /ec2/instance?batch={"ids":["aa","bb","cc"]}:健壯的設計
GET /ec2/instance?batch=[{"method":"DELETE","id":"aa"},{"method":"DELETE","id":"bb"},{"method":"DELETE","id":"cc"}]:facebook的設計
PPT鏈接:戳這里
騰訊視頻:戳這里
今天的分享就到這里啦隙券,歡迎大家點贊、轉(zhuǎn)發(fā)闹司、留言娱仔、拍磚~
技能樹。IT修真學院
“我們相信人人都可以成為一個工程師游桩,現(xiàn)在開始牲迫,找個師兄,帶你入門借卧,掌控自己學習的節(jié)奏盹憎,學習的路上不再迷茫”铐刘。
這里是技能樹.IT修真院陪每,成千上萬的師兄在這里找到了自己的學習路線,學習透明化镰吵,成長可見化檩禾,師兄1對1免費指導“碳溃快來與我一起學習吧~