作者:覃超链接:https://www.zhihu.com/question/28557115/answer/48094438来源:知乎著作权归作者所有,转载请联系作者获得授权。我觉得问题很好:REST -- REpresentational State Transfer 直接翻译:表现层状态转移。这个中文直译经常出现在很多博客中。尼玛谁听得懂“表现层状态转移”?这是人话吗?我自己也困惑了很久,查询了很多资料,花了差不多一年有个还算清晰的理解。分享如下:@Ivony 老师的一句话概括很精辟:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。****--- 简洁版 ---0. REST不是"rest"这个单词,而是几个单词缩写。但即使那几个单词说出来,也无法理解在说什么 --!! (不是要贬低人,是我自己也理解困难);1. REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。比如:http://api.qc.com/v1/newsfeed**: 获取某人的新鲜;http://api.qc.com/v1/friends**: 获取某人的好友列表;http://api.qc.com/v1/profile**: 获取某人的详细信息;3. 用HTTP协议里的动词来实现资源的添加,修改,删除等操作。即通过HTTP动词来实现资源的状态扭转: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**: 更新个人资料禁止使用: GET http://api.qc.com/v1/deleteFriend** 图例:
/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 方法是安全的,不会对资源状态有所改变(污染)。比如严格杜绝如下情况:GET /deleteProduct?id=15. 资源的地址推荐用嵌套结构。比如:GET /friends/10375923/profileUPDATE /profile/primaryAddress/city6. 警惕返回结果的大小。如果过大,及时进行分页(pagination)或者加入限制(limit)。HTTP协议支持分页(Pagination)操作,在Header中使用 Link 即可。7. 使用正确的HTTP Status Code表示访问状态:HTTP/1.1: Status Code Definitions**8. 在返回结果用明确易懂的文本(String。注意返回的错误是要给人看的,避免用 1001 这种错误信息),而且适当地加入注释。9. 关于安全:自己的接口就用https,加上一个key做一次hash放在最后即可。考虑到国情,HTTPS在无线网络里不稳定,可以使用Application Level的加密手段把整个HTTP的payload加密。有兴趣的朋友可以用手机连上电脑的共享Wi-Fi,然后用Charles监听微信的网络请求(发照片或者刷朋友圈)。如果是平台的API,可以用成熟但是复杂的OAuth2,新浪微博这篇:授权机制说明**各端的具体实现如上面的图所示,Server统一提供一套RESTful API,web+ios+android作为同等公民调用API。各端发展到现在,都有一套比较成熟的框架来帮开发者事半功倍。-- 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开发系列网络篇之Retrofit**-- iOS --推荐:RestKit ( RestKit/RestKit · GitHub** )教程:Developing RESTful iOS Apps with RestKit**-- Web --推荐随便搞!可以用重量级的AngularJS,也可以用轻量级 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**最后附带一个彩蛋:Facebook台球表演: 台球1—在线播放**