Jiang's blog

学习笔记之---restful架构

Word count: 3.1kReading time: 11 min
2020/03/14 Share

详解restful架构

1. web服务

我们在浏览器中能看到的每个网站,都是一个web服务。这种”互联网软件”采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。
网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。

目前主流的三种web服务交互方案:

  • – REST ( Representational State Transfer)表述性状态转移

  • – SOAP (Simple Object Access Protocol) 简单的对象访问协议

  • – XML-RPC (XML Remote Procedure Call)基于XML的远程过程调用

XML-RPC是通过XML将调用函数封装,并使用HTTP协议作为传送机制。
后来在新的功能不断被引入下,这个标准慢慢演变成为今日的SOAP协定。
SOAP服务则是以本身所定义的操作集,来访问网络上的资源。
SOAP也是基于XML的,但是它不只限于HTTP协议的传输,包括TCP协议,UDP协议都可以传输。
REST相比SOAP更加简洁,性能和开发效率也有突出的优势。


2. restful架构的历史

REST这个词,全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移,是Roy Thomas Fielding在他2000年的博士论文中提出的。Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。他在论文中提到:”我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。

REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。


3. 理解restful

3.1 什么是资源

REST全称是表述性状态转移,那究竟指的是什么的表述? 其实指的就是资源。
所谓”资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。任何事物,只要有被引用到的必要,它就是一个资源。那么在我们的网络中,我们要引用资源,资源一定要有一个标识,在web中的唯一标识就是URI(统一资源定位符),URI我们不常听说,我们经常用URL,那么两者区别是什么

什么是URI,URL?

  • URI 统一资源标志符。
  • URL 统一资源定位符。
  • URI是给我们的资源进行标识的,URL是描述我们资源地址的。
    比如说我们每个人都有名字和身份证,名字可能重名,但是身份证是唯一的,那么身份证号就可以是我们的URI,标识我们每个人,也可以说标识我们每个资源。我们可以通过身份证号找到这个人,也可以通过地址找到他,这个就是我们的URL,我们通过这两种方式都可以找到我们的资源,
  • 其实我们的URL可以说是URI的子集,通过定位的方式实现的URI。

3.2 统一资源接口

现在我们可以通过URL去访问到资源,那么我们对资源会有很多不同的操作,增删改查,以前我们可能会为了这个增加新设计一个URL,然后这个URL就是对数据进行增加的,还会为了更新和删除分别设计一个URL,现在我们不用了,我们只有一个URL,然后根据HTTP请求方式的不同,对资源进行不同的操作,这个就是是统一资源接口。我们一定要遵循HTTP请求方法的语义,也就是说POST请求就在新增数据等….

RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。

下面列出了GET,DELETE,PUT和POST的典型用法:

GET

  • 安全且幂等
  • 获取表示
  • 变更时获取表示(缓存)
  • 200(OK) - 表示已在响应中发出
  • 204(无内容) - 资源有空表示
  • 301(Moved Permanently) - 资源的URI已被更新
  • 303(See Other) - 其他(如,负载均衡)
  • 304(not modified)- 资源未更改(缓存)
  • 400 (bad request)- 指代坏请求(如,参数错误)
  • 404 (not found)- 资源不存在
  • 406 (not acceptable)- 服务端不支持所需表示
  • 500 (internal server error)- 通用错误响应
  • 503 (Service Unavailable)- 服务端当前无法处理请求

POST

  • 不安全且不幂等
  • 使用服务端管理的(自动产生)的实例号创建资源
  • 创建子资源
  • 部分更新资源
  • 如果没有被修改,则不过更新资源(乐观锁)
  • 200(OK)- 如果现有资源已被更改
  • 201(created)- 如果新资源被创建
  • 202(accepted)- 已接受处理请求但尚未完成(异步处理)
  • 301(Moved Permanently)- 资源的URI被更新
  • 303(See Other)- 其他(如,负载均衡)
  • 400(bad request)- 指代坏请求
  • 404 (not found)- 资源不存在
  • 406 (not acceptable)- 服务端不支持所需表示
  • 409 (conflict)- 通用冲突
  • 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
  • 415 (unsupported media type)- 接受到的表示不受支持
  • 500 (internal server error)- 通用错误响应
  • 503 (Service Unavailable)- 服务当前无法处理请求

PUT

  • 不安全但幂等
  • 用客户端管理的实例号创建一个资源
  • 通过替换的方式更新资源
  • 如果未被修改,则更新资源(乐观锁)
  • 200 (OK)- 如果已存在资源被更改
  • 201 (created)- 如果新资源被创建
  • 301(Moved Permanently)- 资源的URI已更改
  • 303 (See Other)- 其他(如,负载均衡)
  • 400 (bad request)- 指代坏请求
  • 404 (not found)- 资源不存在
  • 406 (not acceptable)- 服务端不支持所需表示
  • 409 (conflict)- 通用冲突
  • 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
  • 415 (unsupported media type)- 接受到的表示不受支持
  • 500 (internal server error)- 通用错误响应
  • 503 (Service Unavailable)- 服务当前无法处理请求

DELETE

  • 不安全但幂等
  • 删除资源
  • 200 (OK)- 资源已被删除
  • 301 (Moved Permanently)- 资源的URI已更改
  • 303 (See Other)- 其他,如负载均衡
  • 400 (bad request)- 指代坏请求
  • 404 (not found)- 资源不存在
  • 409 (conflict)- 通用冲突
  • 500 (internal server error)- 通用错误响应
  • 503 (Service Unavailable)- 服务端当前无法处理请求

3.3 资源的表述

资源的表述其实就是资源的展现形式,我们客户端和服务端传输的都是资源的表述,而不是资源本身。
例如文本资源可以采用html、xml、json等格式,图片可以使用PNG或JPG展现出来。
资源的表述包括数据和描述数据的元数据,例如,HTTP头”Content-Type” 就是这样一个元数据属性。
那么客户端如何知道服务端提供哪种表述形式呢?
可以通过HTTP内容协商,客户端可以通过Accept头请求一种特定格式的表述,服务端则通过Content-Type告诉客户端资源的表述形式。
这些资源的表述呈现在页面上,就是我们说的资源状态。

3.4 状态转移

我们在看页面的时候,从当前资源的表述(也可以说状态或者表现层)会跳转到其他的资源状态。
服务端通过超媒体告诉客户端当前状态有哪些后续状态可以进入。
这些类似”下一页”之类的链接起的就是这种推进状态的作用——指引你如何从当前状态进入下一个可能的状态。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是”表现层状态转化”。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

3.5 总结

可以得知REST风格的特点如下:

  1. 在web中,只要有被引用的必要都叫资源。

  2. 每个URI代表一个资源,独一无二的。

  3. 客户端通过HTTP的方法,对服务器端资源进行操作;

  4. 客户端和服务器之间,传递这种资源的某种表现层;

  5. 通过超链接的指引,实现”表现层状态转移”。


4. restful规范

一 、面向资源编程

  • 每个URL代表一种资源,URL中尽量不要用动词,要用名词。

二 、根据method不同,进行不同的操作

  • GET : 用来获取资源
  • POST : 用来新建资源(也可以用于更新资源)
  • PUT : 用来更新资源
  • DELETE : 用来删除资源
  • PATCH : 用来局部更新资源

三 、在URL中体现版本

四 、在URL中体现是否是API

五 、在URL中的过滤条件
https://www.bootcss.com/v1/mycss?page=3

六 、尽量使用HTTPS
https://www.bootcss.com/v1/mycss

七 、响应时设置状态码

  • 1** 信息,服务器收到请求,需要请求者继续执行操作

  • 2** 成功,操作被成功接收并处理

  • 3** 重定向,需要进一步的操作以完成请求

  • 4** 客户端错误,请求包含语法错误或无法完成请求

  • 5** 服务器错误,服务器在处理请求的过程中发生了错误

八 、返回值

  • GET请求 返回查到所有或单条数据

  • POST请求 返回新增的数据

  • PUT请求 返回更新数据

  • PATCH请求 局部更新 返回更新整条数据

  • DELETE请求 返回值为空

九 、返回错误信息
返回值携带错误信息

十 、Hypermedia API
如果遇到需要跳转的情况 携带调转接口的URL

ret = {
    code: 100,
    data: {
        id: 1,
        name: '小明',
        depart_id: 'http://www.baidu.com/api/v1/depart/4/'
}
}

参考文章

理解RESTful架构

RESTful

RESTful 架构详解

CATALOG
  1. 1. 详解restful架构
    1. 1.1. 1. web服务
    2. 1.2. 2. restful架构的历史
    3. 1.3. 3. 理解restful
      1. 1.3.1. 3.1 什么是资源
      2. 1.3.2. 3.2 统一资源接口
      3. 1.3.3. 3.3 资源的表述
      4. 1.3.4. 3.4 状态转移
      5. 1.3.5. 3.5 总结
    4. 1.4. 4. restful规范
      1. 1.4.1. 参考文章