惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
S
Security Affairs
T
Tor Project blog
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
U
Unit 42
云风的 BLOG
云风的 BLOG
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
量子位
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
腾讯CDC
AI
AI
Last Week in AI
Last Week in AI
Latest news
Latest news
Google Online Security Blog
Google Online Security Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell

微风静语

用 codebase-memory-mcp 给 AI 编程加一层“代码记忆” EchoCraft - 专为独立开发者和小型团队打造的产品官网主题 Halo 站长必备:外链安全与流量分析神器——“链接工具箱”重磅升级! Halo插件开发:java17旧项目迁移至java21项目记录 Halo插件|一个面向创作者的多功能媒体处理工具集 分布式事务详解:从入门到精通 让你的网站初步适配PWA Halo主题 - 微浸:以轻量构建美学,用细节定义体验 深入理解Python爬虫技术:原理、实现与实践 Halo-2.20 新特性:自定义登录页面模版 vue3 中父子组件数据传输踩坑 将你的服务运维面板从宝塔替换为1panel Python实战项目:外星人入侵(源码分享) theme-hao主题适配友链自助提交插件 plugin-artalk 插件保姆级使用教程 plugin-blog-hao 插件部分功能演示 halo 插件开发踩坑记录(一) Thymeleaf 模版引擎语法浅记 信息洪流中的自我救赎 mac 系统里如何管理多个jdk版本 memso API 不完全指南 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法 halo-theme-hao主题:artalk评论区美化 衡量个人成长 halo-theme-hao 主题魔改教程 分享一个魔改的 Artalk 评论系统邮件模版 halo-theme-hao 主题标签记录 开发一个 Halo2.0 的安全条跳转中台插件! Mac 软件推荐:使用 Mac 一年半来,我一直在用的软件! TypeScript教程---面向对象编程 软件版本命名规范 TypeScript教程---基础语法及编译设置 2024年家乡春季的第一场大雪 提问的智慧 基础篇:容器化部署技术 -—docker,从此摆脱多环境配置的苦恼! 普通本科的四年大学教育,给我带来了什么? 因果与平衡 程序的本质:代码是如何被执行的 软件开发者应该具备的基本提问素质 如何编写 Restful 风格的接口 探索力 Springboot入门基础篇 springboot中如何使用注解来实现aop Java 实体代码生成器 lombok 的使用 深入 Java 泛型 分布式版本控制工具 git 的基本使用 如何搭建前后端分离的项目 初识Vue3--令人焕然一新的使用逻辑和代码组织方式! 浅谈前端发展史 为什么要学习数据结构和算法 关于富文本编辑器 wangeditor 在 vue2 项目中的使用
Springboot项目生成接口文档方法
webjing · 2022-11-19 · via 微风静语

1.前言

1.为什么需要接口文档

当前后端分离时,需要前后端共同定义接口,编写接口文档。所以,在项目开发过程中需要有一个统一的文件进行沟通交流开发。
对开发人员而言,项目的维护和人员更迭,都需要文档来作为记录。方便后期人员查看、维护。

2.apidoc

apidoc是一个轻量级的在线REST接口文档生成系统,可以根据其特定的规则的代码注释来生成静态网页。首先看下它生成的文档界面和风格。

支持
apidoc支持多种主流的编码语言,包括Java、C、C#、php和javascript。一般情况下,语言会有多种注释方法,例如就Java中有普通风格的多行注释和Javadoc风格的注释。apidoc并不支持所有的注释,譬如Java仅中支持Javadoc风格的注释。首先要说明的是,apidoc并不具备语义识别能力,它不会发现代码中是否有BUG,它仅仅通过文件后缀来判断语言类型。

3.有哪些常用的API自动生成文档工具

swagger 这款工具感觉是最常用的一款自动生成文档的工具。
附上官网地址:https://swagger.io/
apidoc。第一次见到这个api文档是在公司的cmdb的接口文档中看见,个人比较喜欢这种风格的。
附上github地址:https://github.com/apidoc/apidoc

2. apidoc 生成接口文档

2.1、使用前的准备工作

  1. 确认当前电脑安装了node.js。检测是否安装
node -v

出现提示则表示已安装
2. 安装apidoc
默认安装的是最新版本,但是0.29.0或以下版本是无法生成api_data.json文件的,导致无法导入 apifox。

npm install apidoc@0.29.0 -g
npm install apidoc -g
  1. 然后再测试一下apidoc是否安装成功
apidoc -v

出现提示则为,安装成功


2.2、.springboot项目中使用apidoc

  1. 首先准备一个空的springboot的项目。

  2. 在项目中新建package.json 文件
    位置:与 pom.xml 文件的级别相同

  3. package.json 文件的内容:

{
  "name": "测试api文档",
  "version": "0.1.0",
  "description": "这只是一个测试的页面",
  "title": "APIDOC 测试",
  "url" : "https://127.0.0.1:8080/",
}

2.3.方法接口前加上注释

@Autowired
    private MemberListService memberListService;
    /**
     * @api {get} /memberlist/:会员用户列表
     * @apiDescription  会员用户列表展示
     * @apiName memberlist
     * @apiParam {String} phoneNo 用户的电话
     * @apiParamExample {json} Request-Example:
     * {
     *     "phoneNo":"15713669254"
     * }
     * @apiGroup memberlist
     * @apiSampleRequest /memberlist
     */
 
    @RequestMapping("/memberlist")
    public List<UserCouponRecord> memberList(String phoneNo){
        return  memberListService.getMemberList(phoneNo);
    }

注意:在idea中,直接在插件商店中安装 apidoc 插件,然后在接口方法里边右击生成接口注释。

2.4.生成文档

apidoc 和 swagger不同的是,接口文档和代码文件都是分开的。一开始只需要专心编写接口代码,当代码编写完成时,只需在方法上加上指定的注释。(到这里,也就是我上述所描述的内容)。最终通过一段命令执行生成最终的html文档。
回归正题,在准备工作中我们已经安装了apidoc,然后我们通过apidoc命令生成文档:

apidoc -i apiTestDemo/ -o apidocDemo/
``
-i 指定源文件的目录,也就是项目的根目录。  
-o 指定输出 文档的目录,生成文档的地址。

3、使用 Swagger3 生成 API 接口文档

3.1、导入依赖

<dependency> 
  <groupId>io.springfox</groupId> 
  <artifactId>springfox-boot-starter</artifactId>
  <version>3.0.0</version> 
</dependency>

3.2、构建 Swagger 配置类

为了统一管理 Swagger,这里还是推荐给 Swagger3 添加一个配置类。当然这里也可以根据自己的需求,可要可不要,但总体来说还是建议配置。

另外,在之前集成 Swagger2 的文章中,忘记了给大家说一点。平常在工作中,Swagger 的使用仅限于在开发环境,而在生产环境中,我们是要将其移除的。这里为了灵活管理,推荐大家在项目配置文件 application.yml 中添加关于 Swagger 开关的配置,比如这里我添加的配置如下,true 则代表开启 Swagger,false 则表示关闭 Swagger。

swagger: enabled: true

配置完成之后,我们就需要在 Swagger 配置类中获取 Swagger 开关的值了,关于具体用法就可以看下边配置代码。

package com.imooc.bilibili.service.config;  
  
import io.swagger.models.auth.In;  
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import springfox.documentation.builders.RequestHandlerSelectors;  
import springfox.documentation.oas.annotations.EnableOpenApi;  
import springfox.documentation.service.*;  
import springfox.documentation.spi.DocumentationType;  
import springfox.documentation.spi.service.contexts.SecurityContext;  
import springfox.documentation.spring.web.plugins.Docket;  
  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;  
  
/**  
 * swagger API文档生成配置  
 * @author dreamChaser  
 * @date 2022-12-07  
 */@Configuration  
@EnableOpenApi  
public class SwaggerConfig {  
  
    @Value("${swagger.enabled}")  
    private Boolean swaggerEnabled;  
  
    @Bean("docket")  
    public Docket docket() {  
        return new Docket(DocumentationType.OAS_30)  
                .apiInfo(apiInfo())  
                // 是否开启swagger  
                .enable(swaggerEnabled)  
                .select()  
                // 过滤条件,扫描指定路径下的文件  
                .apis(RequestHandlerSelectors.basePackage("com.imooc.api"))  
                .build()  
                // 授权信息设置,必要的header token等认证信息  
                .securitySchemes(securitySchemes())  
                // 授权信息全局应用  
                .securityContexts(securityContexts());  
  
    }  
  
    /**  
     * 设置授权信息  
     */  
    private List<SecurityScheme> securitySchemes() {  
        ApiKey apiKey = new ApiKey("BASE_TOKEN", "token", In.HEADER.toValue());  
        return Collections.singletonList(apiKey);  
    }  
  
    /**  
     * 授权信息全局应用  
     */  
    private List<SecurityContext> securityContexts() {  
        return Collections.singletonList(  
                SecurityContext.builder()  
                        .securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")})))  
                        .build()  
        );  
    }  
  
    private ApiInfo apiInfo() {  
        // 作者信息  
        Contact contact = new Contact("dreamChaser", "http://localhost:15505", "3368316006@qq.com");  
        return new ApiInfo(  
                "仿bilibili的Springboot后端项目",  
                "仿bilibili的Springboot后端项目接口文档展示",  
                "v1.0",  
                "http://localhost:15505",  
                contact,  
                "Apache 2.0",  
                "http://www.apache.org/licenses/LICENSE-2.0",  
                new ArrayList()  
        );  
    }  
  
}

3.3、swagger里边的接口注释解释:

  1. @ApiOperation("获取用户公钥")
    用在方法上,标注这个接口的作用,它会显示在index.html 的接口UI上。
  2. @ApiResponses({@ApiResponse(code = 200, message = "请求成功")})
    @ApiResponses 用于方法上,用于返回响应结果示例说明,其中可以包含多个@ApiResponse 用于声明每一个响应结果的具体信息,其中 code 是状态码,message请求的信息。
  3. @ApiImplicitParams 和 @ApiImplicitParam
    示例如下:
@ApiImplicitParams({@ApiImplicitParam(name = "user", value = "用户实体",required = true, paramType = "body", dataType = "user", example = "{phone:'', email:'', password:''}")})

@ApiImplicitParams 标注在方法上,用于声明一个接口里边需要用到的参数。其中里边可以包含多个 @ApiImplicitParam ,每一个@ApiImplicitParam中都声明每个参数的信息。
@ApiImplicitParam 标注一个参数的名称、值、是否必须,参数类型、数据类型、用例等信息。
@ApiImplicitParam 参数详解:

参数名称参数作用参数类型参数种类示例
name参数名String---name="username"
value参数的具体意义和作用String---value="用户名称"
required参数是否必填Boolean---required=true
dataType参数的数据类型String参数类型,默认String,其它值dataType="Integer"@ApiImplicitParams({@ApiImplicitParam(name = "user", value = "用户实体",required = true, paramType = "body", dataType = "user", example = "{phone:'', email:'', password:''}")})
paramType查询参数类型:Stringpath:以地址的形式提交数据;query:直接跟参数完成自动映射赋值,以?号拼接;body:以流的形式提交数据,仅支持post ;header:参数在request header里边提交;form:以form表单的形式提交,仅支持post提交
defaultValue参数的默认值
dataTypeClass数据类型符合java语法的数据类型在设置了 dataTypeClass 属性的情况下,会覆盖 dataType 属性。 推荐采用这个方式

有时候 @ApiImplicitParam 会和 @Requestody 注释发生冲突

  1. @Api(tags = {"用户相关服务"})
    用在类上,为这个类里边的所有接口方法贴上一个标签,注意的是需要用 tags 这个参数进行标注。
  2. @ApiModel():用于响应实体类上,用于说明实体作用:
    参数:
description="描述实体的作用"  
  1. @ApiModelProperty:用在属性上,描述实体类的属性
    参数:
value="用户名"  描述参数的意义
name="name"    参数的变量名
required=true     参数是否必选
  1. @ApiParam():用于方法的参数上进行参数说明,可以替换 @ApiImplicitParam 和 @ApiImplicitParams 表示对参数的要求和说明
name="参数名称"
value="参数的简要说明"
defaultValue="参数默认值"
required="true" 表示属性是否必填,默认为false

示例:

@ApiOperation("用户登录")
@PostMapping("find")
public JsonData login(
        @ApiParam(name = "name", value = "用户名", example = "mike") @RequestParam("name") String name,
        @ApiParam(name = "phone", value = "手机号", example = "110") @RequestParam("phone") String phone
        ) {
    //返回数据
    return JsonData.buildSuccess();
}