使用easyYapi生成文档

easyYapi生成文档

      • 背景
      • 1.安装配置
        • 1.1 介绍
        • 1.2 安装
        • 1.3 配置
          • 1.3.1 Export Postman
          • 1.3.2 Export Yapi
          • 1.3.3 Export Markdown
          • 1.3.4 Export Api
          • 1.3.6 常见问题补充
      • 2. java注释规范
        • 2.1 接口注释规范
        • 2.2 出入参注释规范
      • 3. 特定化支持
        • 3.1 必填校验
        • 3.2 忽略导出
        • 3.3 返回不一致
        • 3.4 设置header
        • 3.5 设置tag
        • 3.6 设置open
        • 3.7 序列化相关
      • 4. 自定义配置
      • 5. 问题

背景

​ 因为公司业务需要接口自动化测试,所以需要针对所有java项目的后端接口进行完整的文档梳理并同步到yapi接口管理平台,在使用swagger实操过程中,发现了一款比较好用的yapi生成工具,特别好用,不仅支持无侵入的方式生成文档,还支持定制化处理。下面一起来就通过笔者的这篇博文来了解EasyYapi这款插件的使用吧。

1.安装配置

1.1 介绍

基于java注释生成api接口文档的idea插件。

  • 代码零侵入

  • 通过注释生成api接口文档

  • 实时生成并同步相关接口平台

  • 灵活的配置规则适应项目特性

官方手册 easyYapi

1.2 安装

支持以下IDE

  • 2017.3及以上版本。

从IDEA仓库中安装

  • Preferences(Settings) --> Plugins > Browse repositories --> find"EasyYapi" --> Install Plugin
    在这里插入图片描述

手动下载安装:

  • 下载插件 Jetbrains or Github -> Preferences(Settings) > Plugins > Install plugin from disk...

下载地址: https://plugins.jetbrains.com/

重启IDE

1.3 配置

插件安装完成,可以直接通过在某个类或者某个文件夹下 右键->easyYapi->exportYapi
在这里插入图片描述

1.3.1 Export Postman

导出为postman支持的接口信息。

  • 直接导出: 导出为json格式的api接口信息 可以导入Postman中

  • 配置postman的token导出: 通过在Preferences —> Other Settings—>EasyApi 中配置postman对应的token 会直接同步到postman上

配置token

在这里插入图片描述

postman token获取方式

​ https://martian-spaceship-950587.postman.co/integrations/service/pm_pro_api

在这里插入图片描述
效果

在这里插入图片描述

1.3.2 Export Yapi

导出并同步到yapi服务端。

  • 直接导出

​ 首次使用: 需要配置yapi服务端地址 ip+port 和对应yapi分类中的token

​ 1). 配置服务地址
在这里插入图片描述

​ 2) . 配置yapi对应分类的token

在这里插入图片描述

​ 3). token来源获取
在这里插入图片描述

1.3.3 Export Markdown

​ 导出为md文件、直接导出为md文件

1.3.4 Export Api

​ 导出各种类型的请求信息,export api可以针对某个接口进行导出。
在这里插入图片描述##### 1.3.5 call api

Call Api:生成调试工具 可以进行请求调试调用。
在这里插入图片描述

1.3.6 常见问题补充
  1. yapi、postman配置错误或者变更: 可通过Preferences —> Other Settings—>EasyApi修改。
    在这里插入图片描述
  2. 导出yapi时 , 每个module需要配置相应的token, 即对应一个yapi中的项目

2. java注释规范

2.1 接口注释规范

[] 表示可选操作

/**
 * 分类名称
 * [分类备注/描述]
 *
 * [@module 归属项目]
 */
@RestController
@RequestMapping(value = "/pathOfCtrl")
public class MockCtrl {

    /**
    * api名称
    * [api描述]
    * [@param param1 参数1的名称或描述]  对于get请求有作用@RequestParam或者@PathVariable有效
    * [@param param2 可以用`@link`来表示当前参数的取值是某个枚举{@link some.enum.or.constant.class}]
    * [@param param3 当目标枚举字段与当前字段名不一致,额外指定{@link some.enum.or.constant.class#property1}]
    * [@return 响应描述]
    */
    @RequestMapping(value = "/pathOfApi1/${orderCode}")
    public Result methodName1(long param1,
                      @RequestParam String param2,
                      @RequestParam(required = false, defaultValue = "defaultValueOfParam3") String param3){
        ...
    }


    /**
    * 默认使用`application/x-www-form-urlencoded`,
    * 对于`@RequestBody`将使用`application/json`
    *
    * 可以用注解`@Deprecated`来表示api废弃
    * 也可以用注释`@deprecated`
    * [@deprecated 改用{@link #methodName3(String)}  只能引用同一个方法]
    * [@deprecated 改用{@link #yapi地址}或者{@see #yapi地址}]
    */
    @Deprecated
    @RequestMapping(value = "/pathOfApi2")
    public Result methodName2(@RequestBody MockDtoOrVo jsonModel){
        ...
    }

}
  • GET请求的入参@RequestParam或者@PathVariable 中在注释上必须使用@param、出参使用@return。才能生成正常入参文档。
2.2 出入参注释规范
public class MockDtoOrVo {

    /**
     * 字段注释
     */
    private Long field1;

    /**
     * 使用@see来说明当前字段的取值是某个枚举
     * @see some.enum.or.constant.enum
     */
    private int field3;

    /**
     * 当目标枚举字段与当前字段名不一致,额外指定
     * @see some.enum.or.constant.enum#property1
     */
    private int field4;

    /**
     * 可以用注解`@Deprecated`来表示字段被废弃
     * 也可以用注释`@deprecated`
     * @deprecated It's a secret
     */
    @Deprecated
    private int field5;

    /**
     * 如果使用javax.validation的话
     * 可以使用@NotBlank/@NotNull表示字段必须
     */
    @NotBlank
    @NotNull
    private String field6;
  
    //序列化名称 
    @JSONField(name="aaa")
    @JsonAlias("aaa")
    @JsonProperty("aaa")
    private String field7;

    ...
}
  • 字段是常量或者枚举值、可以使用@see 引用枚举,注意枚举、常量对应的类也需要写对应的注释

3. 特定化支持

yapi有对应的通用配置能大致满足我们通用接口的生成,但是针对项目中一些特殊接口,yapi也提供了灵活的运用配置规则 通过自定义配配置来适应项目特性以减少代码侵入。

  • 默认支持的通用配置Preferences —> Other Settings—>EasyApi -->Recommend
    在这里插入图片描述
3.1 必填校验

默认配置

field.required: 用于标记字段是否为必须。 默认支持javax.validation annotations。

param.required: 用于标记API参数是否为必须。 默认支持javax.validation annotations。

#get请求入参
param.required=@javax.validation.constraints.NotBlank
param.required=@javax.validation.constraints.NotNull
param.required=@javax.validation.constraints.NotEmpty

#post请求入参
field.required=@javax.validation.constraints.NotBlank
field.required=@javax.validation.constraints.NotNull
field.required=@javax.validation.constraints.NotEmpty
//get请求 入参 
@GetMapping("/update/get"public Map<String, Object> getHttp(Integer fileId) {}

//get请求 参数为path            
@GetMapping("/update/get/{orderCode}")
public Map<String, Object> getHttpPath(@PathVariable(name = "orderCode") Integer orderCode) {

//@NotBlank  @NotEmpty  
//get请求 参数为path 
@GetMapping("/update/get"public Map<String, Object> getHttp(@NotNull Integer fileId) {}


//post请求入参属性生成必填
public class AreaUpdateDTO {
    /**
     * 区域对象数组
     */
    @NotNull
    //@NotBlank
    //@NotEmpty
    private List<AreaDTO> areaList;
 }

get请求中@RequestParam、@PathVariable修饰的请求参数生成的文档都是必填

自定义配置

//open接口有这种方法使用 @Validated 如果继续使用@NotNull等注解会破坏现有接口
public ResultBody<ContractAddResultDTO4Open> chCarCorverContractAdd(@Validated @RequestBody CarCoverPromotionContractAddDto dto){
  • 自定义注解
/**
 * 字段必填注解标识
 * @author xieqx
 */
@Target({ElementType.FIELD, ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface CrmFieldRequired {
}
  • 添加自定义配置规则
#设置字段必填 且支持使用自定义注解
field.required=@com.yiche.crm.base.annotations.CrmFieldRequired

param.required=@com.yiche.crm.base.annotations.CrmFieldRequired
  • 使用
//get请求
@GetMapping("/update/get"public Map<String, Object> getHttp(@CrmRequired Integer fileId) {}

//post请求入参属性生成必填
public class AreaUpdateDTO {
    /**
     * 区域对象数组
     */
    @CrmRequired
    private List<AreaDTO> areaList;
}
3.2 忽略导出

ignore: 整个类或者接口方法不导出。

/**
* Mock Apis
* @ignore 忽略当前类
*/
@RestController
@RequestMapping(value = "mock")
public class MockCtrl {

    /**
    * Mock String
    * @ignore 忽略当前api
    */
    @GetMapping("/string")
    public String mockString() {
        return Result.success("mock string");
    }

}

field.ignore:字段忽略不导出。

默认支持如下

#字段级别导出
field.ignore=@com.fasterxml.jackson.annotation.JsonIgnore#value
field.ignore=!@com.google.gson.annotations.Expose#serialize
  • 自定义注解
/**
 * 字段忽略注解
 * @author xieqx
 */
@Target({ElementType.FIELD, ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface CrmFieIdIgnore {
}

自定义配置

field.ignore=@com.yiche.crm.base.annotations.CrmFieIdIgnore
param.ignore=@com.yiche.crm.base.annotations.CrmFieIdIgnore
3.3 返回不一致

**method.return: ** 设置方法的返回值。

常用于以下情况:

  • 方法响应统一封装
  • 方法返回Object
  • 方法返回类型中的泛型类型未明确<Object>/<?>/<*>
  • 方法返回类型与实际响应无关, 例如通过操作HttpServletResponse来返回响应

目前特殊接口

crm系统中大部分的请求出参情况如下:

//1.返回泛型未明确
public ResultBody getSpecialApprovalAttach()//2.出参与响应不一致
@CommonResult
public String getHttpPath()  
@CommonResult
public PageInfo<Student> getHttpPath()
@CommonResult
public List<Student> getHttpPath()     
  
//3.下载导出
@CommonResult
public void download(HttpserveletResponse resp)   

自定义配置规则

#该配置的意思是 无论返回值是怎样的只需在注释中使用@real_return 后引入真实的对象类型即可
#it.doc("real_return") 中real_return自定义字符串即可(最好项目统一)
method.return[#real_return] =
  groovy: "com.yiche.crm.common.rest.ResultBody<" +  helper.resolveLink(it.doc("real_return")) +">"
    
#对于只返回单个字段 
#method.return.main[groovy:it.returnType().isExtend("com.yiche.crm.common.rest.ResultBody")]=data 
  • 使用
//1.返回泛型未明确
/**
 * @real_return  {@link String}
 */
public ResultBody getSpecialApprovalAttach(){
    return ResultBody.ok("hello");
}
  
//2.出参与响应不一致
/**
 * @real_return  {@link String}
 */
@CommonResult
public String getHttpPath() {
  return "hello"
} 
/**
 * @real_return  {@link PageInfo<Student>}
 */
@CommonResult
public PageInfo<Student> getHttpPath()

/**
 * @real_return  {@link List<Student>}
 */  
@CommonResult
public List<Student> getHttpPath()     
  
//3.下载导出
/**
 * @real_return  {@link void}
 * 或者
 * @real_return  {@link com.alibaba.excel.EasyExcel}
 */    
@CommonResult
public void download(HttpserveletResponse resp)   
3.4 设置header

method.additional.header: API需要额外的header

  • 配置
#所有接口都需要设置如下header
#method.additional.header={name: "Authorization",value: "",desc: "认证Token",required:true, example:""}

api.tag=@open_header

# 特定的接口需要添加header
# 对于注释使用@open_header的接口 需要特定的header(主要针对crm系统open接口)
method.additional.header[groovy:it.hasDoc("open_header")]={name: "token",value: "",desc: "认证Token",required:true}
method.additional.header[groovy:it.hasDoc("open_header")]={name: "source",value: "",desc: "来源,接口调用方",required:true}

# 对于注释使用@open_yxs_header的接口 需要特定的header(主要针对crm系统open-yxs接口)
method.additional.header[groovy:it.hasDoc("open_yxs_header")]={name: "x-access-ework-token",value: "",desc: "鉴权token",required:true}

  • 使用
/**
 *
 * @open_header 添加open_header配置的header
 * @open_yxs_header 添加open_yxs_header配置的header
 */
@GetMapping("/update/download")
@CommonResult
public ResultBody download(HttpServletResponse response){}
3.5 设置tag

api.tag: 标记接口,脚本中可以使用it.getDoc(“tagNam”)获取到。

  • 配置
#语法 [#标记的名字] --- 注释中写@tagLabel 在yapi的tag中显示tagName
api.tag[#tagLabel]=tagName

api.tag=@open_header
  • 使用
/**
 *
 * @open_header 添加open_header配置的header
 * @deprecated 注释中使用
 */
@Deprecated  //java注解
@GetMapping("/update/download")
@CommonResult
public ResultBody download(HttpServletResponse response){}
3.6 设置open

api.tag: 标记接口是否公开,从yapi导出api的时候可以选择只导出开放接口的api。

  • 配置
#配置方式
api.open=#open
api.open=#myTag
  • 使用
/**
 *
 * @open
 * 或者
 * @myTag
 */
@GetMapping("/update/download")
public Map<String, Object> areaUpdateNotice(@RequestBody AreaUpdateDTO dto) {
3.7 序列化相关

字段名称与返回的类型不一致的问题

@JSONField(name="aaa")
@JsonAlias("aaa")
@JsonProperty("aaa")
private Integer status;

easyYapi默认支持@JsonProperty(“aaa”)的转换,其他转换需要配置

#支持@JSONField注解
field.name=@com.alibaba.fastjson.annotation.JSONField#name

#支持@JsonAlias注解
field.name=@com.fasterxml.jackson.annotation.JsonAlias#value

4. 自定义配置

设置字段必填 且支持使用自定义注解
field.required=@com.yiche.crm.base.annotations.YapiRequired

#是否开放接口 不设置默认 非开放
api.open=#open
api.open=#xiu

#设置标签
#api.tag[#xiu]=my_tag
api.tag=@open_header
api.tag=@open_yxs_header

# 对于注释使用@的接口 需要特定的header(主要针对crm系统open接口)
method.additional.header[groovy:it.hasDoc("open_header")]={name: "token",value: "",desc: "认证Token",required:true}
method.additional.header[groovy:it.hasDoc("open_header")]={name: "source",value: "",desc: "来源接口调用方",required:true}


# 对于注释使用@open的接口 需要特定的header(主要针对crm系统open_yxs接口)
method.additional.header[groovy:it.hasDoc("open_yxs_header")]={name: "x-access-ework-token",value: "",desc: "易小鲨认证Token",required:true}

#支持@JSONField注解
field.name=@com.alibaba.fastjson.annotation.JSONField#name

#支持@JsonAlias注解
field.name=@com.fasterxml.jackson.annotation.JsonAlias#value

5. 问题

  • Map、JsonObject问题处理

  • 必填校验,如果多个接口使用同一个入参,必填字段不一样使用必填注解也是有问题的

  • 返回单个字段 无法设置注释

  • Postman 调试添加用例

  • yapi整合测试、mock、生成测试报告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/488711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧医疗包括哪些方面?智慧医疗发展前景如何?

近年来&#xff0c;随着云计算、物联网&#xff08;internet of things&#xff0c;IOT&#xff09;、移动互联网、大数据、人工智能&#xff08;artificial intelligence&#xff0c;AI&#xff09;、5G网络、区块链等新一代信息技术的逐步成熟和广泛应用&#xff0c;信息化已…

HTML(二)

一、表格标签 1.1表格的主要作用 表格主要用于显示、展示数据&#xff0c;因为它可以让数据显示的非常的规整&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理。 1.2 表格的…

外地报医保怎么备案?异地就医备案流程是什么?

外地医疗保险如何办理&#xff1f; 外地医疗保险备案的具体流程可能因地区和医疗保险政策的不同而有所不同&#xff0c;但一般来说&#xff0c;可以通过以下方式进行备案&#xff1a; 1、网上备案&#xff1a;不少地区已经推出网上备案服务&#xff0c;可以通过当地医保局官网…

SQLServer SEQUENCE用法

SEQUENCE&#xff1a;数据库中的序列生成器 在数据库管理中&#xff0c;经常需要生成唯一且递增的数值序列&#xff0c;用于作为主键或其他需要唯一标识的列的值。为了实现这一功能&#xff0c;SQL Server 引入了 SEQUENCE 对象。SEQUENCE 是一个独立的数据库对象&#xff0c;用…

高等数学基础篇(数二)之微分方程(高阶线性微分方程)

高阶线性微分方程&#xff1a; 1.线性微分方程的解的结构 2.常系数齐次线性微分方程 3.常系数非齐次线性微分方程 4.欧拉方程 5.差分方程 目录 1.线性微分方程的解的结构 2.常系数齐次线性微分方程 3.常系数非齐次线性微分方程 4.欧拉方程 5.差分方程 1.线性微分方程…

【C++练级之路】【Lv.16】红黑树(冰与火的碰撞,红与黑的史诗)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、红黑树的概念二、红黑树的模拟实现2.1 结点2.2 成员变量2.3 插入情况一&#xff1a;uncle在左&#xff…

C++ STL- list 的使用以及练习

目录 0.引言 1. list 介绍 2. list 使用 2.1 构造函数 2.2 list iterator 的使用 3 list capacity 4. list element access 5. list modifiers 6. list 迭代器失效 7. list 与vector 对vector 8. OJ 题讲解 删除链表的倒数第 N 个节点&#xff1a; 0.引言 …

tcp/ip是什么意思,tcp/ip协议包含哪几层

TCP/IP是一种网络通信协议&#xff0c;它是互联网所采用的基本协议。TCP/IP协议是由美国国防部高级研究计划局&#xff08;ARPA&#xff09;在上世纪70年代设计开发的&#xff0c;经过多年发展和完善&#xff0c;已成为全球范围内最重要的网络通信协议之一。 首先&#xff0c;让…

python能做什么

python能做什么 Web开发&#xff1a;Python具有许多流行的Web框架&#xff0c;如Django和Flask&#xff0c;使得它成为Web开发的首选语言。它简洁、易于学习、且拥有丰富的生态系统&#xff0c;能够快速构建高性能的Web应用。 数据科学和机器学习&#xff1a;Python在数据科学…

Luminar Neo:重塑图像编辑新纪元,Mac与Win双平台畅享创意之旅

在数字时代的浪潮中&#xff0c;图像编辑软件已成为摄影师和设计师们不可或缺的创作工具。Luminar Neo&#xff0c;作为一款专为Mac与Windows双平台打造的图像编辑软件&#xff0c;正以其卓越的性能和创新的编辑功能&#xff0c;引领着图像编辑的新潮流。 Luminar Neo不仅继承…

Vue3更新Package.json版本号

由于我之前已经更新过了&#xff0c;下面的方法提示我已经是最新的了&#xff0c;记录一下&#xff0c;过段时间在测试一下 npm install -g vue/clivue upgrade

Python算法100例-4.2 列出真分数序列

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.拓展训练 1&#xff0e;问题描述 按递增顺序依次列出所有分母为40、分子小于40的最简分数。 2&#xff0e;问题分析 分子和分母只有公因数1的分数&…

《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)

1.简介 在实际工作中&#xff0c;我们进行web自动化的时候&#xff0c;文件上传是很常见的操作&#xff0c;例如上传用户头像&#xff0c;上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。 2.为什么selenium没有提供API&#xff1f; 想必小伙伴们或者…

【学习】软件测试人员如何设计出优秀的测试用例

在软件开发的过程中&#xff0c;测试用例如同工程质量的守护者&#xff0c;它们的存在确保了软件产品的稳定性和可靠性。然而&#xff0c;如何设计出优秀的测试用例&#xff0c;让其在千变万化的软件世界中独领风骚&#xff0c;成为众多测试工程师追寻的目标。本文将为你揭示其…

9、垃圾回收器

为什么分代GC算法要把堆分成年轻代和老年代&#xff1f;首先我们要知道堆内存中对象的特性&#xff1a; 系统中的大部分对象&#xff0c;都是创建出来之后很快就不再使用可以被回收&#xff0c;比如用户获取订单数据&#xff0c;订单数据返回给用户之后就可以释放了。老年代中…

小红书矩阵批量发布工具,一键发布笔记软件

昨日&#xff0c;我收到了一条充满渴望与期待的私信&#xff0c;来自一位小红书的矩阵账号博主。他手握多个账号&#xff0c;渴望寻找一款能够助力他批量发布笔记的神器&#xff0c;每日能够轻松达到百篇的发布量。这份迫切的需求&#xff0c;我深感体会&#xff0c;因为这正是…

看漫画学Python:有趣好玩

书籍介绍 Python是一门既简单又强大的编程语言&#xff0c;被广泛应用于数据分析、大数据、网络爬虫、自动化运维、科学计算和人工智能等领域。Python也越来越重要&#xff0c;成为国家计算机等级考试科目&#xff0c;某些中小学也开设了Python编程课程。本书秉承有趣、有料、…

个人周总结

个人周总结&#xff1a; 对于总体方向目标的完成&#xff0c;完成的不是很好&#xff0c;这周内的很多天都在游离&#xff0c;就是事情可能有需要做的&#xff0c;但是动力不很足&#xff0c;期间就是有点摆烂了。后面及时调整调整吧&#xff0c;有这种情况&#xff0c;一个原…

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…