首先:
一、什么是REST ?
概念:
REST 名词,一种网络架构规范
全称是: REpresentational State Transfer 直接翻译—>表现层状态转移
最大特点:资源、统一接口、URI和无状态。
通俗点翻译就是:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
详细解释:
1、 Rest是面向资源的,这个概念非常重要,而资源是通过URl进行暴露
URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。
比如:左边是错误的设计,而右边是正确的
这里
GET/rest/api/getDogs -->GET/rest/api/dogs 获取所有小狗狗GET/rest/api/addDogs -->POST/rest/api/dogs 添加一个小狗狗
GET/rest/api/editDogs/:dog_id-->
PUT/rest/api/dogs/:dog_id 修改一个小狗狗
GET/rest/api/deleteDogs/:dog_id--> DELET/rest/api/dogs/:dog_id 删除一个小狗狗写代码片
左边的这种设计,很明显不符合REST风格,上面已经说了,URI 只负责准确无误的暴露资源,而 getDogs/addDogs…已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现
2、REST很好地利用了HTTP本身就有的一些特征,如HTTP动词、HTTP状态码、HTTP报头等等
REST API 是基于 HTTP的,所以你的API应该去使用 HTTP的一些标准。这样所有的HTTP客户端(如浏览器)才能够直接理解你的API(当然还有其他好处,如利于缓存等等)。REST 实际上也非常强调应该利用好 HTTP本来就有的特征,而不是只把 HTTP当成一个传输层这么简单了。
HTTP动词
- GET 获取一个资源
- POST 添加一个资源
- PUT 修改一个资源
- DELETE 删除一个资源
实际上,这四个动词实际上就对应着增删改查四个操作,这就利用了HTTP动词来表示对资源的操作。
HTTP状态码
- 200 OK
- 400 Bad Request
- 500 Internal Server Error
在 APP 与 API 的交互当中,其结果无非就三种状态:
- 所有事情都按预期正确执行完毕 - 成功
- APP 发生了一些错误 – 客户端错误
- API 发生了一些错误 – 服务器端错误
这三种状态与上面的状态码是一一对应的。
HTTP报头
- Authorization 认证报头
- Cache-Control 缓存报头
- Cnotent-Type 消息体类型报头
……
报头还有很多,不一一列举。HTTP报头是描述HTTP请求或响应的元数据,它的作用是客户端 与 服务器端进行相互通信时,告诉对方应该如何处理本次请求。
3、超媒体
4、REST 的六大特征约束?
- 客户端-服务端 :客户端与服务器分离
优点:提高用户界面的便携性(操作简单)
通过简化服务器提高可伸缩性(高性能,低成本)
允许组件分别优化(可以让服务端和客户端,分别进行改进和优化) - 无状态(stateless) :从客户端的每个请求要包含服务器所需要的所有信息
优点:提高可见性(单独考虑每个请求)
提高可靠性(更容易从局部故障中修复)
提高可扩展性(降低了服务器资源使用) - 缓存(cacheable): 服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求
优点:减少交互次数
减少交互的平均延迟 - 分层系统 :系统组件不需要知道与他交流组件之外的事情。封装服务,引入中间中间层
优点:限制了系统的复杂性,提高了可扩展性 - 统一接口 :客户和服务器之间通信的方法必须是统一化的。
(Ross:GET,POST,PUT.DELETE, etc)
优点;提高交互的可见性
鼓励单独改善组件 - 支持按需代码(code-one-Demand 可选)
服务器可以提供一些代码或者脚本(Ross:Javascrpt,flash,etc)并在客户的运行环境中执行。这条准则是这些准则中唯一不必必须满足的一条。
优点:提高可扩展性,根据需求编写接口
二、RESTful 架构风格
RESTful架构风格最初是由Roy T.Fielding(HTTP/1.1协议专家组负责人)在2000年的博士学位论文中提出。HTTP就是该架构风格的典型应用。其特点:可扩展和简单性受到越来越多的架构师和开发者青睐。在企业中,RESTful API(也称RESTful Web服务)也逐渐超越SOAP成为实现SOA的重要手段之一。时至今日,RESTful架构风格已成为企业及服务的标配。
1、 资源
所谓”资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一首歌曲、一种服务,总之是一个具体的实在。资源总是通过载体反应其内容;
内容的表现形式可以分为:txt格式,html格式,xml格式,jpg格式等JSON格式是最常用的资源变现格式。
资源又离不开数据。那么他们的的关系呢?
资源是以json(或其他Representation)为载体、面向用户的一组数据集,资源是对信息的表达倾向于概念模型中的数据
- 资源总是以某种Representation为载体显示的,即序列化的信息
- 常用的Representation是json(推荐)或者xml(不推荐)等
- Representation是REST架构的表现层
2、统一接口
RESTful架构风格规定,数据的元操作即CRUD(create,read,update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用来更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成数据的所有增删查改工作。
- GET(SELECT) :从服务器取出资源(一项或多项)
- POST(CREATE) :在服务器新建一个资源
- PUT(UPDATE) :在服务器更新资源(客户端提供完整资源数据)
- PATCH(UPDATE) :在服务器更新资源(客户端提供需要修改的资源数据)
- DELETE(DELETE) :从服务器删除资源
3、URI
可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以了。因此URI就成了每一个资源的地址或标示符。
一般的每个资源至少有一个URI与之对应,最典型的URI即URL
4、无状态
所谓无状态,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。