重拾 RESTful API

date
Jan 11, 2024
slug
relearn-restful-api
status
Published
tags
RESTful API
summary
RESTful API 知识点总结
type
Post

REST 是什么

Representational State Transfer 数据表现形式地传输
  1. 万维网软件架构风格
  1. 特指用来创建网络服务

REST 限制

客户端-服务器(client-server)

  1. 关注点分离
  1. 服务端专注数据存储
  1. 前端专注用户界面

无状态(Stateless)

  1. 用户会话信息均保存在客户端
  1. 每次请求必须包括所有信息,不能依赖上下文信息(翻页功能中的下一页必须传入下一页的页码)
  1. 服务端不保存会话信息,提升了简单性(代码减少)、可靠性(软件稳定程度以及从故障中恢复正常的能力,但从用户会话来说如果保存在后端处理事故很难恢复)、可见性(模块、接口的透明程度,每次请求包含必要的所有信息)

缓存(Cache)

  1. 所有服务端的响应都必须标记为可缓存或者不可缓存(静态资源:图片、字体、样式等为可缓存,动态资源:接口一般为不可缓存)
  1. 减少前后端交互,提升性能

统一接口(Uniform Interface)

  1. 接口设计尽可能的统一、通用
  1. 接口与实现逻辑解耦,使前后端独立开发

分层系统(Layered System)

  1. 层与层知道彼此超过一层互不干涉
  1. 客户端不知道是和代理还是服务器通信
  1. 安全层、负载均衡(流量分发)、缓存层等

按需代码(Code On Demand)

  1. 客户端可下载/接收服务端传递的代码(如:js)

统一接口如何设计

资源标识

  1. 资源是任何可以命名的事物,比如用户、评论等
  1. 每个资源可以通过 URI 被唯一标识
例子
https://api.github.com/users

https://api.github.com/users/i7eo
💡
在设计 URI 时面临深层关系时建议遵循最大三层表述的原则如:/users/i7eo/repositories/eo-imooc/blob/main 其中 /users/i7eo 为一层表述,依此类推。

通过表述来操作资源

  1. 表述(Representational),比如:JSON、XML 等
  1. 客户端不能直接操作(SQL)服务端资源
  1. 客户端应该通过表述(JSON)操作服务端资源

自描述信息

  1. 每个消息(请求或响应)必须提供足够的信息让接受者理解
  1. 媒体类型(application/json、application/xml 等)
  1. HTTP 方法(GET/POST/PATCH(部分替换)/PUT(全量替换)/DELETE)
  1. 是否缓存(Cache-Control)

超媒体作为应用状态引擎

  1. 超媒体(带文字的链接)
  1. 应用状态(一个网页)
  1. 引擎(驱动、跳转)
例子
a 标签

RESTful API 设计

组成要素

  1. 基本 URI
  1. 标准 HTTP Method
  1. 传输媒体类型 JSON/XML

例子

请求设计规范

  1. URI 使用名词,尽可能使用复数,如:/users
  1. URI 使用嵌套表示关联关系,如:/users/12/repos/5
  1. 使用正确的 HTTP 方法,如 GET/POST/PATCH(部分替换)/PUT(全量替换)/DELETE
  1. 不符合上述要求的 CRUD 操作,可考虑使用: POST {资源}/{操作}

响应设计规范

  1. 查询(响应筛选项)
    1. 例子
      https://api.github.com/users?since=100
  1. 分页
    1. 例子
      https://api.github.com/users?page=2&per_page=50
  1. 字段过滤(按照请求中的参数指定,指定返回结果)
    1. 例子
      https://api.github.com/users/i7eo?fields=name
  1. 状态码
    1. 例子
      1. 运行时错误(500)
      1. 逻辑错误,如找不到(404)、表中无查询字段即先决条件失败(412)、无法处理实体即参数格式不对(422)
      1. 处理成功无返回即删除成功(204)
  1. 错误处理(错误信息,message/errors)

安全

  1. HTTPS
  1. 用户鉴权(JWT)
  1. 限流(limit rate)

开发者友好

  1. 文档
  1. 超媒体

最佳实践

参考

 

© i7eo 2017 - 2024