Lehman-Blog - 设计
type: channel
link: https://blog.lehman.top/tag/%E8%AE%BE%E8%AE%A1/
items: RESTful API接口设计规范整理

RESTful API接口设计规范整理
type: item
date: 2021-08-07T15:01:00+08:00
description: RESTful发展背景及简介网络应用程序，分为前端和后端两个部分。当前的发展趋势，就是前端设备层出不穷（手机、平板、桌面电脑、其他专用设备…）。因此，必须有一种统一的机制，方便不同的前端设备与后端进行通信。这导致API构架的流行，甚至出现"APIFirst"的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。REST（Representational State Transfer）表述性状态转换，REST指的是一组架构约束条件和原则。 如果一个架构符合REST的约束条件和原则，我们就称它为RESTful架构。REST本身并没有创造新的技术、组件或服务，而隐藏在RESTful背后的理念就是使用Web的现有特征和能力， 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深， 但是理论上REST架构风格并不是绑定在HTTP上，只不过目前HTTP是唯一与REST相关的实例。RESTful 是一种网络应用程序的设计风格和开发方式，给出一种约定的标准，包含 api 接口规范、命名规则、URL、返回值、授权验证等，以下介绍几种主要的设计规范，我们在项目编写当中需要尽可能的去遵守。正确使用 HTTP 请求方法[scode type="share"]HTTP 请求有 5 种请求方法，对应 CRUD 操作，通常我们使用 GET 来做查询，POST 做提交。[/scode]GET：读取（Read）POST：新建（Create）PUT：更新（Update）PATCH：更新（Update），通常是部分更新DELETE：删除（DeleteURL[scode type="yellow"]URI规范[/scode]不用大写；用中杠-不用下杠_；参数列表要encode；URI中的名词表示资源集合，使用复数形式。[scode type="blue"]URI路径[/scode]既然上面 HTTP 请求方法已经为我们指定了请求的动作，那么请求的 url 路径只需要指定好需要请求的资源就可以了，它是名词，而非动词，或者动宾，比如 /articles 就是正确的，而下面的 URL 不是名词，所以是错误的：/getArticles/createNewCar/deleteAllRedCars[scode type="blue"]URL格式[/scode]URL 是不区分单数和复数的，通常的做法是当读取一个集合，比如 GET /articles，则表示读取所有文章，GET /articles/3 则表示读取某一篇文章。实际情况中我们应该避免 URL 嵌套过深常见的情况是，资源需要多级分类，因此很容易写出多级的 URL，比如获取某个作者的某一类文章。GET /authors/12/categories/2 这种 URL 不利于扩展，语义也不明确，往往要想一会，才能明白含义。更好的做法是，除了第一级，其他级别都用查询字符串表达。GET /authors/12?categories=2 下面是另一个例子，查询已发布的文章。我们可能会设计成下面的 URL。GET /articles/published 查询字符串的写法明显更好。GET /articles?published=true服务器响应接口的 API 返回的数据格式，不应该是纯文本，而应该是一个 JSON 对象，因为这样才能返回标准的结构化数据。所以，服务器回应的 HTTP 头的 Content-Type 属性要设为 application/json。 目前的前后端开发大部分数据的传输格式都是 JSON，因此定义一个统一规范的数据格式有利于前后端的交互与 UI 的展示。[collapse status="false" title="Request"]HTTP方法通过标准HTTP方法对资源CRUD：[scode type="blue"]安全性和幂等性[/scode]安全性：不会改变资源状态，可以理解为只读的；幂等性：执行1次和执行N次，对资源状态改变的效果是等价的。安全性/幂等性GET √ √POST × ×PUT × √DELETE × √[scode type="blue"]Format[/scode]只用以下常见的3种body format：1.Content-Type: application/jsonPOST /v1/animal HTTP/1.1 Host: api.example.org Accept: application/json Content-Type: application/json Content-Length: 24 { "name": "Gir", "animalType": "12" } 2.Content-Type: appli…