在前后端开发中,API文档和API风格设计是提高开发效率、减少沟通成本、确保系统稳定性的关键环节。一个清晰、易用的API文档可以帮助前端开发者快速理解接口的使用方法,而完善的测试则能尽早发现潜在问题,避免上线后出现故障。接下来,我们将从 API风格设计 API 文档 两个方面,详细探讨如何提高开发效率。

API风格设计

项目如何选择合适的API风格?

RESTful API

RESTful API 是基于 REST(Representational State Transfer) 架构风格设计的API。它使用HTTP协议的标准方法(GET、POST、PUT、DELETE等)来操作资源,资源通过URL标识,数据通常以JSON格式传输。

前后端对接

URL设计:使用名词表示资源,动词由HTTP方法表示。

  • 获取用户列表:<font style="color:rgb(64, 64, 64);">GET /users</font>
  • 创建用户:<font style="color:rgb(64, 64, 64);">POST /users</font>
  • 更新用户:<font style="color:rgb(64, 64, 64);">PUT /users/{id}</font>
  • 删除用户:<font style="color:rgb(64, 64, 64);">DELETE /users/{id}</font>

数据格式:通常为JSON,字段命名建议统一(如小驼峰或下划线)。

GraphQL

GraphQL 是一种查询语言和运行时环境,允许前端按需获取数据。它通过一个统一的入口(通常是<font style="color:rgb(64, 64, 64);">/graphql</font>)处理所有请求,前端通过查询语句指定需要的数据字段。

前后端对接

  1. Schema定义:使用GraphQL的类型系统定义数据结构。
type User {
id: ID!
name: String!
email: String!
} type Query {
users: [User!]!
}
  1. 查询语句:前端通过查询语句指定需要的数据字段。
query {
users {
id
name
}
}
  1. 响应数据:后端返回与查询语句匹配的数据。
# 返回数据
{
"data": {
"users": [
{ "id": 1, "name": "Alice", "email": "alice@example.com" },
{ "id": 2, "name": "Bob", "email": "bob@example.com" }
]
}
}

Websocket

WebSocket 是一种全双工通信协议,适合实时性要求高的场景。它通过建立长连接,支持客户端和服务端之间的双向通信。

前后端对接

  1. 建立连接:前端通过<font style="color:rgb(64, 64, 64);">new WebSocket(url)</font> 或者 第三方<font style="color:rgb(64, 64, 64);">websocket</font>进行建立连接。
  2. 消息格式:可以是JSON、二进制等。
  3. 事件监听:前端监听<font style="color:rgb(64, 64, 64);">onmessage</font><font style="color:rgb(64, 64, 64);">onopen</font><font style="color:rgb(64, 64, 64);">onclose</font>等事件。

RPC

RPC 是一种远程过程调用方式,通过调用远程函数来实现通信,通常基于 HTTP 或 TCP 协议。接口通常以动词命名,表示具体的操作。

前后端对接

  1. 使用统一的接口定义语言(如 Protobuf)。
  2. 定义清晰的请求和响应数据结构。
  3. 统一错误码和错误消息格式。

gRPC

gRPC 是一个高性能、开源的远程过程调用(RPC)框架,由 Google 开发。它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf) 作为接口定义语言(IDL)和数据序列化格式。

前后端对接

  1. 定义 **<font style="color:rgb(64, 64, 64);">.proto</font>** 文件
  • 前后端共同维护 <font style="color:rgb(64, 64, 64);">.proto</font> 文件,定义服务、消息类型和 RPC 方法。
syntax = "proto3";
package example; service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
} message UserRequest {
int32 id = 1;
} message UserResponse {
int32 id = 1;
string name = 2;
string email = 3;
}
  1. 生成代码
  • 使用 <font style="color:rgb(64, 64, 64);">protoc</font> 工具生成客户端和服务端代码。
  • 前端使用 gRPC-Web 或类似工具生成客户端代码。
  1. 错误处理
  • 使用 gRPC 的状态码(如 <font style="color:rgb(64, 64, 64);">OK</font><font style="color:rgb(64, 64, 64);">INVALID_ARGUMENT</font>)和错误消息。
  1. 安全性

    • 使用 TLS 加密通信,确保数据安全。

SOAP

SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在分布式环境中交换结构化信息。它通常与 WSDL(Web Services Description Language)结合使用,描述服务的接口和数据格式。

前后端对接

  1. 定义 WSDL 文件
  • 使用 WSDL 描述服务接口和数据结构。
<definitions name="UserService"
targetNamespace="http://haijun.com/UserService"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="GetUserRequest">
<part name="userId" type="xsd:int"/>
</message>
<message name="GetUserResponse">
<part name="user" type="tns:User"/>
</message>
<portType name="UserService">
<operation name="GetUser">
<input message="tns:GetUserRequest"/>
<output message="tns:GetUserResponse"/>
</operation>
</portType>
</definitions>
  1. 生成客户端代码

    • 使用工具(如 <font style="color:rgb(64, 64, 64);">wsimport</font>)生成客户端代码。
  2. 错误处理
    • 使用 SOAP Fault 返回错误信息。
  3. 安全性
    • 使用 WS-Security 进行加密和签名

Webhook

Webhook 是一种基于 HTTP 的回调机制,允许一个系统在特定事件发生时,主动向另一个系统发送通知。它广泛应用于事件驱动的架构中,是实现实时通信和系统集成的关键技术之一。


API 文档

为什么要引入API 文档?

  1. 降低沟通成本:前后端开发者无需频繁沟通,通过文档即可了解接口细节。
  2. 提高开发效率:前端开发者可以提前基于文档进行开发,无需等待后端接口完成。
  3. 便于维护:清晰的文档可以帮助新成员快速上手项目。

API 文档具有哪些内容呢?

  1. 接口描述:接口的功能、适用场景。
  2. 请求方法:GET、POST、PUT、DELETE 等。
  3. URL:接口的完整路径。
  4. 请求参数:包括参数名称、类型、是否必填、示例值等。
  5. 响应格式:包括状态码、响应字段、示例响应。
  6. 错误码说明:列出可能的错误码及其含义。
  7. 示例请求:提供完整的请求示例。
  8. 版本信息:接口的版本号及变更记录。
  @Post()
@ApiOperation({ summary: '添加流水信息', tags: ['Cost Records'] }) // 添加 API 操作的摘要
@ApiBody({ type: CreateCostRecordDto }) // 指定请求体的 DTO 类型
@ApiResponse({ status: 201, }) // 添加成功响应信息
@ApiResponse({ status: 400, }) // 添加错误响应信息,根据实际需要添加更多
create(@Body() createCostRecordDto: CreateCostRecordDto) {
return this.costRecordService.create(createCostRecordDto);
}

常用的Swagger 装饰器

装饰器 描述 使用场景
@ApiTags 为控制器或方法添加标签,用于组织 Swagger UI 文档。 标明控制器或方法所属的领域,使文档更易于组织。
@ApiOperation 为控制器方法添加操作描述,包括摘要和详细描述。 提供关于 API 操作的清晰说明,方便开发者理解 API 的作用。
@ApiParam 描述路径参数、请求参数或响应参数,包括名称、类型、描述等。 提供详细的参数信息,方便开发者正确使用和理解 API。
@ApiBody 指定请求体的 DTO 类型,用于描述请求体的结构。 明确请求体的结构,帮助开发者正确发送请求。
@ApiResponse 描述 API 的响应,包括状态码、描述等。 提供关于 API 响应的详细说明,方便开发者处理各种响应情况。
@ApiBearerAuth 指定请求需要携带 Bearer Token,用于身份验证。 在需要身份验证的接口中使用,指定需要提供 Token 信息。
@ApiProperty 为 DTO 类型的属性添加元数据,如描述、默认值等。 提供详细的属性信息,使开发者了解 DTO 对象的结构和约束。
@ApiQuery 描述查询参数,包括名称、类型、描述等。 用于标识查询参数,使开发者清晰了解 API 的可用查询选项。
@ApiHeader 描述请求头信息,包括名称、类型、描述等。 提供请求头的详细信息,使开发者正确设置请求头。
@ApiExcludeEndpoint 标记一个控制器方法不在 Swagger UI 中显示。 在一些特殊情况下,可以使用该装饰器排除不需要在文档中展示的接口。

API 文档工具

Swagger/OpenAPI

  • 通过注解或配置文件自动生成API文档。
  • 支持在线测试和调试。

Postman 接口文档

  • 支持手动或自动生成API文档。
  • 提供团队协作功能,方便共享文档。

API文档的最佳实践

  • 保持文档与代码同步:使用工具自动生成文档 或者 配置Swagger注解自动生成,避免手动更新。
  • 提供示例:每个接口都应提供请求和响应的示例。
  • 版本控制:文档应明确标注接口版本,避免混淆。
  • 团队协作:使用支持团队协作的工具(如Postman),确保文档的实时更新。

总结

在本文中,我们从 API 风格的选择到文档的编写,详细探讨了如何选用API设计和构建高效的API文档,来达到提供协作效率。希望这些内容能为你提供实用的指导,帮助你在实际项目中更好地落地 API 设计与文档管理。

如果你觉得这篇文章对你有帮助,欢迎 点赞转发,让更多开发者受益!同时,关注我们,获取更多技术干货和实战经验。我们下期再见!

API 风格选对了,文档写好了,项目就成功了一半!的更多相关文章

  1. Struts2 API的chm格式帮助文档制作教程

    Struts2 API的chm格式帮助文档制作教程 在SSH三个框架中,Struts2的API文档是最难做的,这里所说的格式是chm格式的,chm的格式很方便,Hibernate API文档和Spri ...

  2. Android BLE与终端通信(五)——Google API BLE4.0低功耗蓝牙文档解读之案例初探

    Android BLE与终端通信(五)--Google API BLE4.0低功耗蓝牙文档解读之案例初探 算下来很久没有写BLE的博文了,上家的技术都快忘记了,所以赶紧读了一遍Google的API顺便 ...

  3. UINavigationController 导航控制器 ,根据文档写的一些东西

    今天讲了导航控制器UINavigationController 和标签栏视图控制器UITabBarController 先来说一说导航视图控制器  UINavigationController 导航控 ...

  4. api接口测试工具和接口文档管理工具

    api接口测试工具和接口文档管理工具 1.postman(https://www.getpostman.com) Postman 是一个很强大的 API调试.Http请求的工具.她可是允许用户发送任何 ...

  5. ASP.NET Web API从注释生成帮助文档

    默认情况下,ASP.NET Web API不从Controller的注释中生成帮助文档.如果要将注释作为Web API帮助文档的一部分,比如在帮助文档的Description栏目中显示方法注释中的su ...

  6. 基于POI和DOM4将Excel(2007)文档写进Xml文件

    刚进公司的training, 下面是要求: Requirements Write a java program to read system.xlsx Use POI API to parse all ...

  7. 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版

    .netCHARTING报表图表控件 文档帮助手册Ab3d.PowerToys 文档帮助手册Ab3d.Reader3ds 文档帮助手册ABViewer 文档帮助手册 (工程图纸文档管理系统)Activ ...

  8. 深入分析MFC文档视图结构(项目实践)

    k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer ...

  9. DoNetCore Web Api 采用Swagger进行接口文档管理

    第一步:创建API项目 步骤这里不说明 第二步:就是Nuget 包, 两种方式:1.工具->Nuget管理->程序包管理控制台 Install-Package Swashbuckle.As ...

  10. 我发现 Linux 文档写错了

    作者:小林coding 图解计算机基础网站:https://xiaolincoding.com 大家好,我是小林. 周末的时候,有位读者疑惑为什么 Linux man 手册中关于 netstat 命令 ...

随机推荐

  1. 人口分析实战(利用jupyter)

    目录 1.项目需求 2.开始操作 2.1导入我们所需要的包 2.2导入数据.查看原始数据 2.3对数据进行清洗 2.4对数据进行处理 1.项目需求 需求: 导入文件,查看原始数据 将人口数据和各州简称 ...

  2. 字符串、列表、元组、字典(python)

    文章目录 1.python字符串 1.1 python访问字符串中的值 1.2Python 字符串连接 1.3Python字符串运算符 2.python列表 2.1访问列表中的值 2.2更新列表 2. ...

  3. Bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法 _2021-11-10

    Bootstrap 栅栏布局中 col-xs-.col-sm-.col-md-.col-lg- 区别及使用方法 全文转自:https://www.cnblogs.com/tangbohu2008/p/ ...

  4. 实践出真知,小程序wepy,uni-app框架开发使用!

    一.前提 目前我只使用过wepy和uni-app框架开发过小程序,着重比较这两个框架使用感受! 另外wepy框架已经不维护了,希望uni-app好好维护下去! wepy和uni-app都是类似于vue ...

  5. CUDA编程学习 (2)——CUDA并行性模型

    1. 基于 kernel 的 SPMD 并行编程 1.1 向量加法 kernel(device 代码) // Device Code // Compute vector sum C = A + B / ...

  6. 记录个Java/Groovy的小问题:空字符串调用split函数返回非空数组

    问题复现 最近写了一个groovy替换程序增量流水线脚本(会Java也能看懂),示意脚本如下: //获取文件列表方法 def listFiles(folder) { def output = sh(s ...

  7. 曲线救国--访问dockerhub仓库

    前言 由于dockerhub也被墙了,导致基础镜像没法拉取.后面解封了,又被墙了... 在这次被墙之前,访问国外的速度也是堪忧,甚至访问不了k8s的镜像,基于此,分享一下笔者经验 使用Daocloud ...

  8. JPEG格式研究——(3)霍夫曼解码

    因为霍夫曼编码以bit为单位,长度又不确定,读取时无法区分,JPEG采用了范式霍夫曼编码. 读取并生成霍夫曼表 JPEG中DC系数和AC系数是分别进行编码将霍夫曼表保存在DQT中. 直接上代码解释可能 ...

  9. 在window 使用 docker 安装redis 踩坑记

    1. 安装REDIS 在安装的时候,使用 docker pull redis 就可以了. 但是 实际上 发现镜像居然拉不下来. 修改了一下 docker 镜像. 配置如下: "registr ...

  10. Content-Type 的小知识

    起因 在某次开发中,前端发起了get请求,但是后端报错未设置Content-Type为"application-json":看到这条报错之后就直接在请求中设置了: export c ...