认识 REST
本节内容总结和归纳 <ASP.NET CORE 与 RESTful 开发实战> 书中的第一章节内容. 并将收录于该系列的笔记目录下.
什么是 REST
REST 中的重要概念 - 资源
REST 提出的 API 需要遵守的约束有哪些
符合以下约束的 web 服务才是真正的 RESTful 服务:
约束条件 | 介绍 |
---|---|
客户端 - 服务端 | 这个约束主要是从开发者角度将关注点分离, 客户端和服务端可以使用不同的技术栈实现独立开发, 只要它们之间的接口不改变即可. |
具备统一接口 | - |
是分层的系统 | 客户端和服务端之间通常会有一层代理或者网关. 客户端和服务端可以不必知道这个代理与网关. 但是它的作用是可以有很多, 比如鉴权, 限流, 复杂均衡等等. |
缓存能力 | 缓存号称是是 web 服务开发之友 |
无状态的 | 客户端发送到服务端的每个请求必须是无状态的请求. 这就要求服务端不需要记住和存储任何客户端的信息. 反之这些信息都由客户端保存和维护. 因此客户端对服务端的请求不能依赖于已发生的请求, 当客户端与服务端发生通信时, 必须包含所有与之相关的信息, 如身份认证信息等等. |
按需编码 | 允许服务端临时向客户端返回可执行的程序代码, 主要用于客户端提供可扩展性和自定义的功能. (这部分我尚未接触过, 读到这里还不能够立刻理解.) |
RPC 风格简单介绍
除了 REST 外, 另一种常见的 API 风格是 RPC 风格, 即远程过程调用(Remote - Procedure - Call). 它与 REST 的区别如下:在关注点方面, REST 面向的是资源, RPC面向的是功能. 在 API endpoint 方面, REST 的 endpoint 是名词, 是资源或者资源集合, 而 RPC 的端点是动词, 是方法名. 在执行特点方面, REST 对资源执行操作, RPC 执行服务器上的方法. 在返回的结果方面, REST 返回的是请求的资源, 而 RPC 则返回调用方法的执行结果.
那么根据我的理解, REST 主要是提供对于资源的操作, 而 RPC 则是提供一种功能的服务.
HTTP 协议部分
笔者感言:
书中提到几乎所有的情况下, REST 是基于 HTTP 协议实现的. 笔者也苟同, 因为本人作为后端 API 开发时, 通常也会和 HTTP 相关的内容经常打交道. 所以深入理解 HTTP 协议将有助于开发者开发出更好更高质量的 API. 所以对于 HTTP 不够了解的同学最好可以去找找相关的专业的材料学习和巩固一下.
上图呢是一张高度概括了很多很多内容的图.
POST 和 PUT 的区别
- POST 是创建资源, 不安全的操作, 不是幂等
- PUT 是更新资源, 在资源不存在时可以创建资源, 也是不安全的操作, 是幂等
- 这两个都可以创建资源的.但是 POST 请求的 URI 是资源集合, 而 PUT 则是请求单个(可能不存在的)资源, 例如:
POST http://api.appdomain.com/users
PUT http://api.appdomain.com/users/1
PUT 与 PATCH
- PATCH 是对资源的部分更新
- PUT 是对资源的全部更新
常见的请求消息头
head | desc | example |
---|---|---|
Accept | content-type | Accept:application/json |
Accept-Charset | 可接受的字符集 | Accept-Charset:utf-8 |
Accept-Encoding | 可接受的响应内容的编码方式 | Accept-Encoding:gzip |
Authorization | 表示资源需要认证的信息 | Authentication: Bearer dfsdfsdfsdfs... |
Cache-Control | 用来指定当前请求是否使用缓存 | cache-control:no-cache |
connection | 客户端想要使用的连接类型 | connection:keep-alive |
cookie | 向服务器提供 cookie | cookie:name=value;name2=value2 |
content-length | 请求正文的长度 | content-length:348 |
content-type | 请求正文的 MIME 类型 | content-type:application/json |
date | 发送该消息的日期和时间 | date:dec.26 |
host | 服务器主机名以及使用的端口号 | - |
if-match | 仅当客户端提供的值与服务器上对应的值相匹配时,才进行对应的操作 | if-match:"12314" |
if-modified-since | 允许当请求资源未被修改时, 返回 304 not modified 代码 | - |
origin | 用于发起一个跨域的资源共享请求 | Origin:http://www.domain.com |
Proxy-Authorization | 用于向代理进行认证的认证信息 | Proxy-Authorization: Basic xxxx |
User-Agent | 用于浏览器表示身份的字符串 | User-Agent:xxx |
常见的响应消息头
head | desc | example |
---|---|---|
Allow | 用于指定资源允许的操作 | Allow: Get |
Cache-control | 指明该响应使用的缓存机制 | Cache-control:max-age=3600 |
Connection | 针对该链接所预期的选项 | connection:close |
content-encoding | 响应正文所使用的编码类型 | content-encoding:gzip |
content-type | 响应正文的MIME类型 | content-type:text/html;charset=utf-8 |
除此外, 还有 http 的状态码, 表示不同的请求的响应对应的状态.