REST

作者:覃超鏈接:https://www.zhihu.com/question/28557115/answer/48094438來源:知乎著作權(quán)歸作者所有甘萧,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)硬梁。我覺得問題很好:REST -- REpresentational State Transfer 直接翻譯:表現(xiàn)層狀態(tài)轉(zhuǎn)移哮独。這個(gè)中文直譯經(jīng)常出現(xiàn)在很多博客中。尼瑪誰聽得懂“表現(xiàn)層狀態(tài)轉(zhuǎn)移”诞外?這是人話嗎?我自己也困惑了很久,查詢了很多資料矾兜,花了差不多一年有個(gè)還算清晰的理解。分享如下:@Ivony 老師的一句話概括很精辟:URL定位資源患久,用HTTP動(dòng)詞(GET,POST,DELETE,DETC)描述操作椅寺。****--- 簡潔版 ---0. REST不是"rest"這個(gè)單詞,而是幾個(gè)單詞縮寫蒋失。但即使那幾個(gè)單詞說出來返帕,也無法理解在說什么 --!! (不是要貶低人,是我自己也理解困難)篙挽;1. REST描述的是在網(wǎng)絡(luò)中client和server的一種交互形式荆萤;REST本身不實(shí)用,實(shí)用的是如何設(shè)計(jì) RESTful API(REST風(fēng)格的網(wǎng)絡(luò)接口)铣卡;2. Server提供的RESTful API中链韭,URL中只使用名詞來指定資源,原則上不使用動(dòng)詞煮落〕ㄇ停“資源”是REST架構(gòu)或者說整個(gè)網(wǎng)絡(luò)處理的核心。比如:http://api.qc.com/v1/newsfeed**: 獲取某人的新鮮;http://api.qc.com/v1/friends**: 獲取某人的好友列表;http://api.qc.com/v1/profile**: 獲取某人的詳細(xì)信息;3. 用HTTP協(xié)議里的動(dòng)詞來實(shí)現(xiàn)資源的添加蝉仇,修改旋讹,刪除等操作殖蚕。即通過HTTP動(dòng)詞來實(shí)現(xiàn)資源的狀態(tài)扭轉(zhuǎn):GET 用來獲取資源,POST 用來新建資源(也可以用于更新資源)沉迹,PUT 用來更新資源睦疫,DELETE 用來刪除資源。比如:DELETE http://api.qc.com/v1/**friends: 刪除某人的好友 (在http parameter指定好友id)POST http://api.qc.com/v1/**friends: 添加好友UPDATE http://api.qc.com/v1/profile**: 更新個(gè)人資料禁止使用: GET http://api.qc.com/v1/deleteFriend** 圖例:


4. Server和Client之間傳遞某資源的一個(gè)表現(xiàn)形式鞭呕,比如用JSON蛤育,XML傳輸文本,或者用JPG琅拌,WebP傳輸圖片等缨伊。當(dāng)然還可以壓縮HTTP傳輸時(shí)的數(shù)據(jù)(on-wire data compression)。5. 用 HTTP Status Code傳遞Server的狀態(tài)信息进宝。比如最常用的 200 表示成功刻坊,500 表示Server內(nèi)部錯(cuò)誤等。主要信息就這么點(diǎn)党晋。最后是要解放思想谭胚,Web端不再用之前典型的PHP或JSP架構(gòu),而是改為前段渲染和附帶處理簡單的商務(wù)邏輯(比如AngularJS或者BackBone的一些樣例)未玻。Web端和Server只使用上述定義的API來傳遞數(shù)據(jù)和改變數(shù)據(jù)狀態(tài)灾而。格式一般是JSON。iOS和Android同理可得扳剿。由此可見旁趟,Web,iOS庇绽,Android和第三方開發(fā)者變?yōu)槠降鹊慕巧ㄟ^一套API來共同消費(fèi)Server提供的服務(wù)锡搜。--- 詳細(xì)版 ---****先說REST名稱REST -- REpresentational State Transfer首先,之所以晦澀是因?yàn)榍懊嬷髡Z被去掉了瞧掺,全稱是 Resource Representational State Transfer:通俗來講就是:資源在網(wǎng)絡(luò)中以某種表現(xiàn)形式進(jìn)行狀態(tài)轉(zhuǎn)移耕餐。分解開來:Resource:資源,即數(shù)據(jù)(前面說過網(wǎng)絡(luò)的核心)辟狈。比如 newsfeed肠缔,friends等;Representational:某種表現(xiàn)形式哼转,比如用JSON明未,XML,JPEG等壹蔓;State Transfer:狀態(tài)變化亚隅。通過HTTP動(dòng)詞實(shí)現(xiàn)。REST的出處Roy Fielding的畢業(yè)論文庶溶。這哥們參與設(shè)計(jì)HTTP協(xié)議煮纵,也是Apache Web Server項(xiàng)目(可惜現(xiàn)在已經(jīng)是 nginx 的天下)的co-founder。PhD的畢業(yè)學(xué)校是 UC Irvine偏螺,Irvine在加州行疏,有著充裕的陽光和美麗的海灘,是著名的富人區(qū)套像。Oculus VR 的總部就坐落于此(虛擬現(xiàn)實(shí)眼鏡酿联,被FB收購,CTO為Quake和Doom的作者 John Carmack)夺巩。眾說周知贞让,論文都是晦澀難懂的。當(dāng)年在CMU讀書的時(shí)候柳譬,很多課程都會(huì)安排每周兩篇的Paper review≡牛現(xiàn)在回想起來每次寫Paper review都是我最為痛苦的時(shí)候。REST這篇博士論文毫無疑問更甚美澳。論文地址:Architectural Styles and the Design of Network-based Software Architectures**REST章節(jié):Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)**REST那章我初讀了销部,整個(gè)論文沒有讀完 =
=

RESTful API實(shí)用的是如何正確地理解 RESTful架構(gòu)和設(shè)計(jì)好RESTful API。首先為什么要用RESTful結(jié)構(gòu)呢制跟?大家都知道"古代"網(wǎng)頁是前端后端融在一起的舅桩,比如之前的PHP,JSP等雨膨。在之前的桌面時(shí)代問題不大擂涛,但是近年來移動(dòng)互聯(lián)網(wǎng)的發(fā)展,各種類型的Client層出不窮聊记,RESTful可以通過一套統(tǒng)一的接口為 Web撒妈,iOS和Android提供服務(wù)。另外對(duì)于廣大平臺(tái)來說甥雕,比如Facebook platform踩身,微博開放平臺(tái),微信公共平臺(tái)等社露,它們不需要有顯式的前端挟阻,只需要一套提供服務(wù)的接口,于是RESTful更是它們最好的選擇峭弟。在RESTful架構(gòu)下:

Server的API如何設(shè)計(jì)才滿足RESTful要求?首先是簡潔版里面的那幾點(diǎn)附鸽。外加一些附帶的 best practices:1. URL root:https://example.org/api/v1/**https://api.example.com/v1/**2. API versioning:可以放在URL里面,也可以用HTTP的header:/api/v1/3. URI使用名詞而不是動(dòng)詞瞒瘸,且推薦用復(fù)數(shù)坷备。BAD/getProducts
/listOrders
/retrieveClientByOrder?orderId=1

GOODGET /products : will return the list of all products
POST /products : will add a product to the collection
GET /products/4 : will retrieve product #4
PATCH/PUT /products/4 : will update product #4

  1. 保證 HEAD 和 GET 方法是安全的,不會(huì)對(duì)資源狀態(tài)有所改變(污染)情臭。比如嚴(yán)格杜絕如下情況:GET /deleteProduct?id=15. 資源的地址推薦用嵌套結(jié)構(gòu)省撑。比如:GET /friends/10375923/profileUPDATE /profile/primaryAddress/city6. 警惕返回結(jié)果的大小赌蔑。如果過大,及時(shí)進(jìn)行分頁(pagination)或者加入限制(limit)竟秫。HTTP協(xié)議支持分頁(Pagination)操作娃惯,在Header中使用 Link 即可。7. 使用正確的HTTP Status Code表示訪問狀態(tài):HTTP/1.1: Status Code Definitions**8. 在返回結(jié)果用明確易懂的文本(String肥败。注意返回的錯(cuò)誤是要給人看的趾浅,避免用 1001 這種錯(cuò)誤信息),而且適當(dāng)?shù)丶尤胱⑨尅?. 關(guān)于安全:自己的接口就用https馒稍,加上一個(gè)key做一次hash放在最后即可皿哨。考慮到國情纽谒,HTTPS在無線網(wǎng)絡(luò)里不穩(wěn)定证膨,可以使用Application Level的加密手段把整個(gè)HTTP的payload加密。有興趣的朋友可以用手機(jī)連上電腦的共享Wi-Fi佛舱,然后用Charles監(jiān)聽微信的網(wǎng)絡(luò)請(qǐng)求(發(fā)照片或者刷朋友圈)椎例。如果是平臺(tái)的API,可以用成熟但是復(fù)雜的OAuth2请祖,新浪微博這篇:授權(quán)機(jī)制說明**各端的具體實(shí)現(xiàn)如上面的圖所示订歪,Server統(tǒng)一提供一套R(shí)ESTful API,web+ios+android作為同等公民調(diào)用API肆捕。各端發(fā)展到現(xiàn)在刷晋,都有一套比較成熟的框架來幫開發(fā)者事半功倍。-- Server --推薦: Spring MVC 或者 Jersey 或者 Play Framework教程:Getting Started · Building a RESTful Web Service**-- Android --推薦: RetroFit ( Retrofit** ) 或者 Volley ( mcxiaoke/android-volley · GitHub** Google官方的被block慎陵,就不貼了 )教程:Retrofit ??? Getting Started and Create an Android Client**快速Android開發(fā)系列網(wǎng)絡(luò)篇之Retrofit**-- iOS --推薦:RestKit ( RestKit/RestKit · GitHub** )教程:Developing RESTful iOS Apps with RestKit**-- Web --推薦隨便搞眼虱!可以用重量級(jí)的AngularJS,也可以用輕量級(jí) Backbone + jQuery 等席纽。教程:http://blog.javachen.com/2015/01/06/build-app-with-spring-boot-and-gradle/**參考:[1]: Some REST best practices**[2]: GitHub API v3**[3]: tlhunter/consumer-centric-api-design · GitHub**最后附帶一個(gè)彩蛋:Facebook臺(tái)球表演: 臺(tái)球1—在線播放**
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捏悬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子润梯,更是在濱河造成了極大的恐慌过牙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺铭,死亡現(xiàn)場離奇詭異寇钉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)舶赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門扫倡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竟纳,你說我怎么就攤上這事撵溃【卫穑” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵征懈,是天一觀的道長石咬。 經(jīng)常有香客問我,道長卖哎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任删性,我火速辦了婚禮亏娜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹬挺。我一直安慰自己维贺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布巴帮。 她就那樣靜靜地躺著溯泣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榕茧。 梳的紋絲不亂的頭發(fā)上垃沦,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音用押,去河邊找鬼肢簿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜻拨,可吹牛的內(nèi)容都是我干的池充。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缎讼,長吁一口氣:“原來是場噩夢啊……” “哼收夸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起血崭,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤卧惜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后功氨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序苏,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年捷凄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忱详。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跺涤,死狀恐怖匈睁,靈堂內(nèi)的尸體忽然破棺而出监透,到底是詐尸還是另有隱情,我是刑警寧澤航唆,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布胀蛮,位于F島的核電站,受9級(jí)特大地震影響糯钙,放射性物質(zhì)發(fā)生泄漏粪狼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一任岸、第九天 我趴在偏房一處隱蔽的房頂上張望再榄。 院中可真熱鬧,春花似錦享潜、人聲如沸困鸥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疾就。三九已至,卻和暖如春艺蝴,著一層夾襖步出監(jiān)牢的瞬間猬腰,已是汗流浹背产镐。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工岳链, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮休。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓锣枝,卻偏偏與公主長得像厢拭,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撇叁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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