RESTful API规范(详细版)

作者: RyuGou

原文地址: RESTful API 规范(详细版)

作者公众号: 互联网技术窝

看的时候感觉写的非常不错 😆,看完自我介绍发现果然是个大佬

1. 简介

rest是一种软件架构风格,如果你们的接口是rest接口,那么就可被认为你们的的接口是 restful 的,英文名词和形容词的区别。

rest接口是围绕“资源”展开的,利用 HTTP 的协议,其实 rest 本也可以和 HTTP 无关,但是现在大家普遍的使用rest都是依托于 HTTP 协议。HTTP 的 url 即资源。

RFC 3986 定义了通用的 URI 语法:

1
URI = scheme “://” authority “/” path [ “?” query ][ “#” fragment ]
  • scheme: 指底层用的协议,如 http、https、ftp
  • host: 服务器的 IP 地址或者域名
  • port: 端口,http 中默认 80
  • path: 访问资源的路径,就是咱们各种 web 框架中定义的 route 路由
  • query: 为发送给服务器的参数
  • fragment: 锚点,定位到页面的资源,锚点为资源 id

2. RESTful API 设计

2.1 资源路径

对于 rest 资源的定义,即 URL 的定义,是最重要的;想要设计出优雅的、易读的 rest 接口,其实还是挺不容易的。

2.2 URL 中不能有动词

在 Restful 架构中,每个网址代表的是一种资源,所以网址中不能有动词,只能有名词,动词由 HTTP 的 get、post、put、delete 四种方法来表示。

2.3 URL 结尾不应该包含斜杠“/”

这是作为 URL 路径中处理中最重要的规则之一,正斜杠(/)不会增加语义值,且可能导致混淆。REST API 不允许一个尾部的斜杠,不应该将它们包含在提供给客户端的链接的结尾处。

许多 Web 组件和框架将平等对待以下两个 URI:

http://api.canvas.com/shapes/

http://api.canvas.com/shapes

但是,实际上 URI 中的每个字符都会计入资源的唯一身份的识别中。

两个不同的 URI 映射到两个不同的资源。如果 URI 不同,那么资源也是如此,反之亦然。因此,REST API 必须生成和传递精确的 URI,不能容忍任何的客户端尝试不精确的资源定位。

有些 API 碰到这种情况,可能设计为让客户端重定向到相应没有尾斜杠的 URI(也有可能会返回 301 - 用来资源重定向)。

2.4 正斜杠分隔符”/“必须用来指示层级关系

url 的路径中的正斜杠“/“字符用于指示资源之间的层次关系。

例如:

http://api.user.com/schools/grades/classes/boys - 学校中所有的男生

http://api.college.com/students/3248234/courses - 检索 id 为 3248234 的学生学习的所有课程的清单。

2.5 应该使用连字符”-“来提高 URL 的可读性,而不是使用下划线”_”

为了使 URL 容易让人们理解,请使用连字符”-“字符来提高长路径中名称的可读性。

一些文本查看器为了区分强调 URI,常常会在 URI 下加上下划线。这样下划线”_”字符可能被文本查看器中默认的下划线部分地遮蔽或完全隐藏。

为避免这种混淆,请使用连字符”-“而不是下划线

2.6 URL 路径中首选小写字母

RFC 3986 将 URI 定义为区分大小写,但 scheme 和 host components 除外。

2.7 URL 路径名词均为复数

为了保证 url 格式的一致性,建议使用复数形式。

3. RESTful API 对资源的操作

对于 rest api 资源的操作,由 HTTP 动词表示

3.1 CURD 操作

  • GET:获取资源
  • POST:新建资源
  • PUT:在服务器更新资源(向客户端提供改变后的所有资源)
  • PATCH:在服务器更新资源(向客户端提供改变的属性)
  • DELETE:删除资源

PATCH一般不用,用PUT

3.2 资源过滤

在获取资源的时候,有可能需要获取某些“过滤”后的资源,例如指定前 10 行数据

http://api.user.com/schools/grades/classes/boys?page=1&page-size=10

3.3 返回状态码推荐标准 HTTP 状态码

有很多服务器将返回状态码一直设为 200,然后在返回 body 里面自定义一些状态码来表示服务器返回结果的状态码。由于 rest api 是直接使用的 HTTP 协议,所以它的状态码也要尽量使用 HTTP 协议的状态码。

  • 200 OK 服务器返回用户请求的数据,该操作是幂等的
  • 201 CREATED 新建或者修改数据成功
  • 204 NOT CONTENT 删除数据成功
  • 400 BAD REQUEST 用户发出的请求有问题,该操作是幂等的
  • 401 Unauthoried 表示用户没有认证,无法进行操作
  • 403 Forbidden 用户访问是被禁止的
  • 422 Unprocesable Entity 当创建一个对象时,发生一个验证错误
  • 500 INTERNAL SERVER ERROR 服务器内部错误,用户将无法判断发出的请求是否成功
  • 503 Service Unavailable 服务不可用状态,多半是因为服务器问题,例如 CPU 占用率大,等等

3.4 返回结果

  • GET /collections 返回资源列表
  • GET /collections/:id 返回单独的资源
  • POST /collections 返回新生成的资源对象
  • PUT /collections/:id 返回完整的资源对象
  • PATCH /collections/:id 返回被修改的属性
  • DELETE /collections/:id 返回一个空文档
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信