REST

作者:覃超
链接:https://www.zhihu.com/question/27785028/answer/48096396
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

— 简洁版 —

0.
REST休是”rest”这个单词,而是几乎独单词缩写。但就那几单单词说出来,也无力回天理解在游说啊
-_-!! (不是要贬低人,是自我自己为明白困难);
1.
REST叙述的凡在网络中client和server的一致种互相形式;REST本身不实用,实用的凡怎样计划
RESTful API(REST风格的网络接口);

  1. Server提供的RESTful
    API中,URL中只是下名词来指定资源,原则达成不动动词。“资源”是REST架构或者说一切网络拍卖的核心。比如:

http:// class=”visible”>api.qc.com/v1/newsfeed:
获取某人之特;
http:// class=”visible”>api.qc.com/v1/friends:
获取某人之挚友列表;
http:// class=”visible”>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:// class=”visible”>api.qc.com/v1/profile:
更新个人资料

明令禁止采取: GET http:// class=”visible”>api.qc.com/v1/deleteFri class=”invisible”>end

图例:


4.
Server暨Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。当然还好压缩HTTP传输时的数量(on-wire
data compression)。

  1. 从而 HTTP Status Code传递Server的状态信息。比如最常用的 200
    表示成功,500 表示Server内部错误等。

 

第一信息就如此点。最后是使解放思想,Web端不再用前典型的PHP或JSP架构,而是改吗前段渲染和附带处理大概的商务逻辑(比如AngularJS或者BackBone的片样例)。Web端和Server只使上述定义的API来传递数据和改多少状态。格式一般是JSON。iOS和Android同理可得。由此可见,Web,iOS,Android和老三方开发者变为平等的角色通过一致效仿API来一头消费Server提供的劳动。

— 详细版 —

先说REST名称
REST:REpresentational State Transfer =
直接翻:表现层状态转移。这个中文直译经常出现于广大博客中。尼玛谁听得明白“表现层状态转移”?这是口语句也?
首先,之所以晦涩是因前面主语被失去丢了,全称是 Resource Representational
State
Transfer:通俗来讲就是是:资源在网络中盖某种表现形式进行状态转移。分解开来:

Resource:资源,即数据(前面说了网的为主)。比如
newsfeed,friends等;
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。

REST的出处
Roy Fielding的毕业论文。这哥们参与计划HTTP协议,也是Apache Web
Server项目(可惜现在既是 nginx 的世界)的co-founder。PhD的结业该校是
UC
Irvine,Irvine在加州,有着丰富的日光与美美的海滩,是有名的富人区。Oculus
VR 的总部就位于于这个(虚拟现实眼镜,被FB收购,CTO也Quake和Doom的撰稿人 John
Carmack)。
议论周知,论文都是生硬难掌握的。当年以CMU读书之当儿,很多学科都见面安排每周半首的Paper
review。现在回想起来每次写Paper
review都是本身最好痛苦的下。REST这篇博士论文毫无疑问更老。
论文地址:Architectural Styles and the Design of Network-based Software
Architectures
REST章节:Fielding Dissertation: CHAPTER 5: Representational State
Transfer
(REST)
REST那章我新读了,整个论文没有读毕 =_=


RESTful API
实用的是何等正确地领略 RESTful架构和计划性好RESTful API。

 

第一为什么要为此RESTful结构为?
世家还了解”古代”网页都是前端后端融在同的,比如事先的PHP,JSP等。在事先的桌面时代问题无老,但是近来移动互联网的进化,各种类型的Client层出不穷,RESTful可以透过一致仿统一的接口也
Web,iOS和Android提供劳动。另外对广大平台来说,比如Facebook
platform,微博开放平台,微信官平台等,它们不需要发出显式的前端,只需要同模拟供服务之接口,于是RESTful更是她最好之选项。在RESTful架构下:

Server的API如何规划才满足RESTful要求?
首先是简洁版里面的那么几碰。外加一些附带的 best practices:

  1. URL root:

https:// class=”visible”>example.org/api/v1/*
https:// class=”visible”>api.example.com/v1/*

  1. API versioning:
    好放在URL里面,也可以为此HTTP的header:

/api/v1/

  1. URI使用名词而非是动词,且推荐用复数。
    BAD
  • /getProducts
  • /listOrders
  • /retrieveClientByOrder?orderId=1

GOOD

  • GET /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
    方法是平安之,不会见指向资源状态有变动(污染)。比如严格杜绝如下情况:

GET /deleteProduct?id=1

  1. 资源的地点推荐用嵌套结构。比如:

GET /friends/10375923/profile
UPDATE /profile/primaryAddress/city

6.
不容忽视返回结果的深浅。如果过特别,及时开展分页(pagination)或者参加限制(limit)。HTTP协议支持分页(Pagination)操作,在Header中行使
Link 即可。

  1. 用正确的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—在线播放

相关文章