Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档

简介: 这篇文章介绍了Swagger,它是一组开源工具,围绕OpenAPI规范帮助设计、构建、记录和使用RESTAPI。文章主要讨论了Swagger的主要工具,包括SwaggerEditor、SwaggerUI、SwaggerCodegen等。然后介绍了如何在Nest框架中集成Swagger,展示了安装依赖、定义DTO和控制器等步骤,以及如何使用Swagger装饰器。文章最后总结说,集成Swagger文档可以自动生成和维护API文档,规范API标准化和一致性,但会增加开发者工作量,需要保持注释和装饰器的准确性。

什么是 Swagger ?

Swagger 是一组围绕 OpenAPI 规范构建的开源工具,可以帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具 包括:

Nest 集成 Swagger

  1. 安装依赖
    pnpm add @nestjs/swagger swagger-ui-express
    
  2. main.ts 文件中定义并初始化 SwaggerModule

    import {
         
          NestFactory } from '@nestjs/core';
    import {
         
          DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
    
    import {
         
          AppModule } from './app.module';
    async function bootstrap() {
         
         
    const app = await NestFactory.create(AppModule);
    
    // 构建swagger文档
    const options = new DocumentBuilder()
      .setTitle('vue3-admin')
      .setDescription('Background system based on Nest.js + Vue3 full stack development')
      .setVersion('1.0')
      .build();
    const document = SwaggerModule.createDocument(app, options);
    SwaggerModule.setup('docs', app, document);
    
    await app.listen(3000);
    }
    bootstrap();
    
  3. 启动服务,访问http://localhost:3000/docs,你会看到 Swagger 页面:
    ve5yt9s0se80a5cityx55zpj01rtdcv1.png

DocumentBuilder 属性

方法 描述
setTitle 文档标题
setDescription 文档描述
setVersion 文档版本
setTermsOfService 文档服务条款
setContact 文档联系信息
setLicense 文档许可证信息
addServer 文档服务地址
setExternalDoc 文档外部链接
setBasePath 设置文档基础路径
addTag 添加文档标签
addExtension 添加扩展
addSecurity 添加安全方案
addGlobalParameters 添加全局参数
addSecurityRequirements 添加安全需求
addBearerAuth 添加 Bearer Token 认证
addOAuth2 添加 OAuth2 认证
addApiKey 添加 ApiKey
addBasicAuth 添加基础认证
addCookieAuth 添加 Cookie 认证
build 构建服务

在 Nest 中使用

  1. DTO(响应数据传输对象) 文件中使用装饰器

    import {
         
          ApiProperty } from '@nestjs/swagger';
    import {
         
          IsNumberString, IsOptional, IsUUID } from 'class-validator';
    
    export class PostParamsDto {
         
         
    @ApiProperty({
         
         
      type: String,
      description: '岗位名称',
      required: false,
      default: '前端工程师',
    })
    name?: string;
    
    @ApiProperty({
         
         
      type: String,
      description: '所属组织',
      default: 'f45cd48b-e703-49db-91be-ae7f594e73e0',
      required: false,
    })
    @IsOptional()
    @IsUUID('all', {
         
          message: 'orgId 参数不正确' })
    orgId?: string;
    
    @ApiProperty({
         
         
      type: Number,
      description: '开始日期',
      default: 1721145600000,
      required: false,
    })
    @IsOptional()
    @IsNumberString({
         
         }, {
         
          message: '开始日期必须是时间戳格式' })
    startTime?: number;
    
    @ApiProperty({
         
         
      type: Number,
      description: '结束日期',
      default: 1721318399999,
      required: false,
    })
    @IsOptional()
    @IsNumberString({
         
         }, {
         
          message: '结束日期必须是时间戳格式' })
    endTime?: number;
    }
    
  2. Controller 控制器 中使用装饰器

    import {
         
          Controller, Get, Query } from '@nestjs/common';
    import {
         
          ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; // swagger 接口文档
    
    import {
         
          PostParamsDto } from './dto/params-post.dto';
    import {
         
          ResponsePostDto } from './dto/response-post.dto';
    import {
         
          PostManageService } from './post-manage.service';
    
    @ApiTags('智能行政-岗位管理')
    @Controller('post-manage')
    export class PostManageController {
         
         
    constructor(private readonly postManageService: PostManageService) {
         
          }
    
    /**
    * @description: 查询岗位列表
    */
    @Get()
    @ApiOkResponse({
         
          type: ResponsePostDto })
    @ApiOperation({
         
          summary: '获取岗位管理列表' })
    findAll(@Query() params: PostParamsDto) {
         
         
    return this.postManageService.findAll(params);
    }
    }
    

常用 Swagger 装饰器

装饰器 描述
@ApiTags 为控制器或方法添加标签,用于组织 Swagger UI 文档
@ApiOperation 为控制器方法添加操作描述,包括摘要和详细描述
@ApiParam 描述路径参数、请求参数或响应参数,包括名称、类型、描述等
@ApiBody 指定请求体的 DTO 类型,用于描述请求体的结构
@ApiResponse 描述 API 的响应,包括状态码、描述等
@ApiBearerAuth 指定请求需要携带 Bearer Token,用于身份验证
@ApiProperty 为 DTO 类型的属性添加元数据,如描述、默认值等
@ApiQuery 描述查询参数,包括名称、类型、描述等
@ApiHeader 描述请求头信息,包括名称、类型、描述等
@ApiExcludeEndpoint 标记一个控制器方法不在 Swagger UI 中显示

效果图

cz9r4j5zgochx1r1xc2g6og0yx5mlv8d.png

总结

Nest 中集成 Swagger 文档可以帮助开发者自动生成和维护 API 文档,Swagger 的集成提供了在线生成、‌自动生成、‌可操作数据库等优点,规范了 API 的标准化和一致性,后期还可以把 Swagger 文档导入到其他平台,例如 ApiFox
xjt59k8vturpenfaamoxy89eqcwkajpk.png

不足之处就是会增加开发者的工作量,每一个接口都需要保持注释和装饰器的准确性和完整性,仍然需要一定的维护工作。

相关文章
|
2天前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
8天前
|
JSON BI API
商城上货API接口的实战案例
在商城上货过程中,API接口扮演着至关重要的角色。以下是对商城上货API接口的实战分析,涵盖其主要功能、类型、安全性以及实战案例等方面。
|
4天前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
9天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
22 1
|
13天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
34 4
|
14天前
|
存储 JSON API
淘宝API接口实战:高效获取商品标题、分类及店铺名称
在淘宝API接口实战中,通过以下步骤高效获取商品标题、分类及店铺名称:1. 准备工作:了解淘宝开放平台文档,注册开发者账号,选择开发语言和工具。2. 获取API访问权限:申请相应权限,提供应用场景说明。3. 调用API接口:构建HTTP请求,提供必要参数。4. 解析响应数据:提取JSON数据中的所需信息。5. 数据处理和存储:进一步处理并存储数据。6. 注意事项:遵守使用规范,注意调用频率和数据安全。示例代码使用Python调用淘宝API。
|
6天前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
12天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
26 0
|
API
SenchaTouch 2.4 离线api文档下载
http://pan.baidu.com/s/1jG5THZK
911 0
|
2天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。

热门文章

最新文章