认识 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 的状态码, 表示不同的请求的响应对应的状态.

    posted @ 2020-05-02 19:38  YanyuWu  阅读(166)  评论(0编辑  收藏  举报