作者:覃超鏈接: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** 圖例:
![](https://pic1.zhimg.com/7405939b62a73f28846533de08db3a80_b.jpg)
![](https://pic1.zhimg.com/7405939b62a73f28846533de08db3a80_b.jpg)
![](https://pic3.zhimg.com/11cdfc60bde58e8545bafe42f0af79ca_b.jpg)
![](https://pic3.zhimg.com/11cdfc60bde58e8545bafe42f0af79ca_b.jpg)
![](https://pic2.zhimg.com/06ee404783540f0af299042057738a99_b.jpg)
![](https://pic2.zhimg.com/06ee404783540f0af299042057738a99_b.jpg)
/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
- 保證 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—在線播放**