Logo
Section 1 / 7

记录我们的 API

文档的重要性概述、现有文档编写方法以及我们将采用的方法。

导入

记录我们的 API

文档的重要性概述、现有文档编写方法以及我们将采用的方法。

我们是否需要文档?

我们必须解决一个缺失的环节:我们需要为我们的 API 编写文档。

但代码注释难道不够吗?

不是!即使暂且不讨论代码注释是否规范的问题,我们这里重点聚焦于 API 文档的编写。

如今的事实标准似乎是使用 Swagger 来实现这一点。为了保持简单,我们将沿用这一方案。此外,附带一份文本形式的文档(哪怕只是一个小型文件)也是有益的,它应说明我们 API 的一些特殊之处。项目越大,越早可能暴露出逻辑上的缺陷,而这些缺陷由于各种原因可能无法轻易修改。

为什么我们需要文档?
为什么我们需要文档?

当前状况

...

*Swagger* 提供了一些工具支持,目前也有大量项目致力于将其集成到你偏好的 Web 框架或工具包中。

在许多情况下,将 Swagger UI 与我们的服务捆绑,并通过特定路径提供访问是一个不错的选择。
根据你的需求和运行环境,我们可能希望对这个路径进行身份验证保护,并支持在生产环境中可配置地关闭该功能。

有了 UI 之后,我们需要决定走哪条路:

  1. 手动编写 swagger.yml 文件来描述我们的 API,生成 JSON 并作为静态资源交付。
  2. 使用某个库在运行时动态生成 JSON。
我们应该选择哪条路径?
我们应该选择哪条路径?

现在我们来比较这两种方法的优缺点。

使用
1swagger.yml
使用库
描述内容基本固定不变描述内容能真实反映实际代码
避免运行时可能出现的性能影响和其他问题可能生成奇怪的推断类型,如 Future1 等
需要额外想办法验证服务是否确实按描述返回内容大量依赖注解来使 API 描述可用
代码与描述解耦代码与描述紧密耦合

对于第一种方式,常用的工具是 Swagger Editor。

而对于倾向于非纯函数式方式的开发者,可以使用 swagger-akka-http 库。

但难道我们不能做得更好吗?

答案是:可以!我们可以利用静态类型来描述 API,让编译器进行检查,并自动生成服务器端和客户端代码。

诚然,Swagger 也支持从定义自动生成代码,但通常(如果不是总是),这些生成的代码只是临时一次性使用的方案——一旦需要重新生成,我们就不得不丢失所有手动修改的内容。

基准测试

使用 Tapir 的纯实现