怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful?

来源:互联网 发布:linux vi 定位到最后 编辑:程序博客网 时间:2024/06/10 15:04

首先:
一、什么是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定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。

作者声明:此文摘自知乎的总结,不明白的可以点击查看原文https://www.zhihu.com/question/28557115。

0 0
原创粉丝点击