Apifox 帮助文档
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
  1. 配置
  • 帮助中心
  • 更新日志
  • 入门
    • 产品介绍
    • 联系我们
    • 私有化部署
  • 开始使用
    • 下载 Apifox
    • 注册与登录
    • 页面布局
    • 基本概念
    • 快速上手
      • 概述
      • 新建接口
      • 发送接口请求
      • 快捷请求
      • 添加断言
      • 新建测试场景
      • 分享 API 文档
      • 了解更多
    • 基础知识
      • 接口基本信息
        • 请求 URL 与方法
        • 请求参数与请求体
        • 请求头
        • 请求参数编码解码
        • HTTP/2
      • 认证与授权
        • 概述
        • 支持的授权类型
        • Digest Auth
        • OAuth 1.0
        • OAuth 2.0
        • Hawk Authentication
        • Kerberos
        • NTLM
        • Akamai EdgeGrid
        • CA 和客户端证书
      • 响应与 Cookie
        • 概述
        • API 响应
        • 创建和发送 Cookie
        • 实际请求
        • 提取响应示例
      • 请求代理
        • 网页端中的请求代理
        • 分享文档中的请求代理
        • 客户端中的请求代理
      • API Hub
        • API Hub
    • 导入导出数据
      • 概述
      • 手动导入
      • 定时导入
      • 导入设置
      • 导出数据
      • 其它方式导入
        • 导入 OpenAPI/Swagger
        • 导入 Postman
        • 导入 Apipost
        • 导入 Eolink
        • 导入 cURL
        • 导入 Markdown
        • 导入 Insomnia
        • 导入 apiDoc
        • 导入 .har 文件
        • 导入 knife4j
        • 导入 NEI
        • 导入小幺鸡(docway)
        • 导入 Apizza
        • 导入 WSDL
  • 设计 API
    • 概述
    • 新建 API 项目
    • 接口基础知识
    • 请求体多示例配置
    • 响应组件
    • 常用字段
    • 全局参数
    • 历史记录
    • 批量管理
    • 数据模型
      • 概述
      • 新建数据模型
      • 通过 JSON 等生成
      • 高级数据类型
      • 构建数据模型
    • 鉴权组件
      • 概述
      • 创建鉴权组件
      • 使用鉴权组件
      • 在线文档中的鉴权组件
    • 高级功能
      • 接口字段
      • 接口状态
      • 关联测试场景
      • 参数列表外观
      • 接口唯一标识
  • 开发和调试 API
    • 概述
    • 生成请求
    • 发送请求
    • 请求历史
    • 接口用例
    • 动态值
    • 校验响应
    • 文档模式/调试模式
    • 生成代码
    • 环境和变量
      • 概述
      • 全局/环境/临时变量
      • 环境与服务
      • Vault Secrets(密钥库)
        • 功能简介
    • 前后置操作&脚本
      • 概述
      • 断言
      • 提取变量
      • 等待时间
      • 数据库操作
        • 概述
        • MongoDB
        • Redis
        • Oracle
      • 使用脚本
        • 概述
        • 前置脚本
        • 后置脚本
        • 公共脚本
        • pm 脚本 API
        • 使用 JS 类库
        • 响应数据可视化
        • 调用外部程序
      • 脚本示例
        • 断言示例
        • 脚本使用变量
        • 脚本读取/修改接口请求信息
      • 常见问题
        • 如何获取动态参数的真实值并加密?
        • 脚本运行后,提取的数字(bigint)精度丢失应该如何处理?
    • API 调试
      • GraphQL 调试
      • WebSocket 调试
      • Socket.IO 调试
      • SSE 调试
      • SOAP/WebService
      • gRPC 调试
      • 使用请求代理调试
      • Dubbo 调试
        • 新建 Dubbo 接口
        • 调试 Dubbo 接口
        • Dubbo 接口文档
      • TCP(Socket)
        • Socket 接口功能简介
        • 报文数据处理器
  • Mock 数据
    • 概述
    • 智能 Mock
    • 自定义 Mock
    • Mock 优先级
    • Mock 脚本
    • 云端 Mock
    • 自托管 Runner Mock
  • 自动化测试
    • 概述
    • 编排测试场景
      • 新建测试场景
      • 测试步骤间传递数据
      • 测试流程控制条件
      • 从接口/用例同步数据
      • 跨项目导入接口/用例
      • 导出测试场景数据
    • 运行测试场景
      • 运行测试场景
      • 批量运行测试场景
      • 数据驱动测试
      • 定时任务
      • 管理其它项目接口的运行环境
    • 测试报告
      • 测试报告
    • API 测试
      • 集成测试
      • 性能测试
      • 端到端测试
      • 回归测试
    • Apifox CLI
      • 概述
      • 安装和运行 CLI
      • CLI 命令选项
    • CI/CD
      • 概述
      • 与 Jenkins 集成
      • 与 Gitlab 集成
      • 与 Github Actions 集成
      • 与其它更多 CI/CD 平台集成
  • 发布 API 文档
    • 概述
    • 快捷分享
    • 查看 API 文档
    • 发布文档站
    • 页面布局设置
    • 自定义域名
    • AI 相关特性
    • 高级设置
      • 文档站搜索设置
      • 跨域代理
      • 文档站接入 Google Analytics
      • SEO 设置
      • 文档左侧目录设置
      • 文档可见性设置
      • 在线 URL 链接规范
    • API 版本
      • 创建 API 版本
      • 发布 API 版本
      • 快捷分享 API 版本
      • 功能简介
  • 迭代分支
    • 功能简介
    • 新建迭代分支
    • 在迭代分支中改动 API
    • 在迭代分支中测试 API
    • 合并迭代分支
    • 管理迭代分支
  • 管理中心
    • 入驻清单
      • 了解基本概念
      • 团队入驻
    • 管理团队
      • 团队基本操作
      • 团队成员管理
      • 成员角色与权限设置
      • 团队资源
        • 通用 Runner
        • 请求代理 Agent
        • 团队变量
      • 实时协作
        • 团队协作
    • 管理项目
      • 项目基本操作
      • 项目成员管理
      • 通知设置
        • 功能简介
        • 通知对象
        • 通知事件
      • 项目资源
        • 数据库连接
    • 管理组织
      • 单点登录(SSO)
        • 功能简介
        • 为组织配置单点登录
        • 管理用户账号
        • 将组映射到团队
        • Microsoft Entra ID
      • SCIM 用户管理
        • 功能简介
        • Microsoft Entra ID
      • 组织资源
        • 自托管 Runner
  • IDEA 插件
    • 快速上手
    • 生成接口文档
    • 生成数据模型
    • 配置
      • 全局配置
      • 项目内配置
      • 可配置规则
      • 脚本工具
      • Groovy 本地扩展
    • 进阶配置
      • 注释规范说明
      • 框架支持
    • 常见问题
      • 常见问题
  • 浏览器扩展
    • Chrome
    • Microsoft Edge
  • Apifox MCP Server
    • 概述
    • 通过 MCP 使用 Apifox 项目内的 API 文档
    • 通过 MCP 使用公开发布的 API 文档
    • 通过 MCP 使用 OpenAPI/Swagger文档
  • 最佳实践
    • 概述
    • 接口之间如何传递数据
    • 登录态(Auth)如何处理
    • 接口签名如何处理
    • 如何加密/解密接口数据
    • Jenkins 定时触发任务
    • 如何计算 AI 问答成本
    • 与其他成员共用数据库连接配置
    • 通过 CLI 运行包含云端数据库连接配置的测试场景
    • 通过 Runner 运行包含云端数据库连接配置的测试场景
  • 账号&应用设置
    • 账号设置
    • 语言设置
    • 网络代理
    • 快捷键
    • 数据备份与恢复
    • 更新 Apifox
    • API 访问令牌
  • 身份验证 & Auth 鉴权指南
    • 什么是 API Key
    • 什么是 Bearer Token
    • 什么是 JWT
    • 什么是 Basic Auth
    • 什么是 Digest Auth
    • 什么是 OAuth 1.0
    • 什么是 OAuth 2.0
      • 什么是 OAuth 2.0
      • 授权码授权类型
      • 授权码授权类型,带有 PKCE
      • 隐式授权类型
      • 密码凭证授权类型
      • 客户端凭证授权类型
  • 服务与隐私协议
    • 服务协议
    • 隐私协议
    • 服务等级协议
  • 参考资料
    • API 设计优先理念
    • JSON Schema 介绍
    • JSONPath 介绍
    • XPath 介绍
    • Apifox Markdown 语法
    • CSV 格式规范
    • 正则表达式
    • 安装 Java 环境
    • Runner 运行环境
    • 常见编程语言对应的数据类型
    • Socket 粘包和分包问题
    • 词汇表
    • 目录链接汇总
    • Apifox Swagger 扩展
      • 概述
      • x-apifox-folder
      • x-apifox-status
      • x-apifox-name
      • x-apifox-maintainer
    • Apifox JSON Schema 扩展
      • 概述
      • x-apifox-mock
      • x-apifox-orders
      • x-apifox-enum
    • 动态值表达式
  • 常见问题
  1. 配置

可配置规则

支持的规则#

基础配置#

规则的 key规则目标(上下文 it)版本规则描述
folder.namemethod1.1.11+设置 api 所属文件夹
class.prefix.pathclass1.1.11+设置 API 请求前缀
ignoreclass/method1.1.11+忽略 API
moduleclass1.1.11+为 api 分组

API 配置#

规则的 key规则目标(上下文 it)版本规则描述
api.namemethod1.1.11+设置 api 的名称
api.tagsmethod1.1.24+设置 api 的标签
api.statusmethod1.1.24+设置 api 的状态
method.descriptionmethod1.1.24+方法(api)的额外注释
method.defaultContentType-1.1.24+用以设置 API 请求的 content-type
method.default.http.methodmethod1.1.11+设置默认的 api 的 HttpMethod
method.request.replacemethod1.1.29+设置默认的 api 的入参命名转换
method.response.replacemethod1.1.29+设置默认的 api 的返回值命名转换
method.additional.headermethod1.1.11+API 需要额外的 header,
{name: "header name",value: "",desc: "",required:false, example:""}
method.additional.parammethod1.1.11+API 需要额外的参数
{name: "param name",value: "defaultValue",desc: "",required:false}
☆method.returnmethod1.1.11+设置返回值的类型
☆method.return.mainmethod1.1.11+设置返回值的核心主体
☆method.return.body.typemethod1.1.28+设置返回值的返回类型
path.multi-1.1.11+设置返回值的核心主体

请求参数#

规则的 key规则目标(上下文 it)版本规则描述
param.defaultValuearg1.1.11+API 参数的默认值
param.descriptionarg1.1.11+参数的额外注释
param.typearg1.1.11+用于设置 API 参数在 HTTP 请求中的类型
param.ignorearg1.1.11+忽略 API 参数
param.requiredarg1.1.11+API 参数是否为必须(即不可为空)

数据模型字段#

规则的 key规则目标(上下文 it)版本规则描述
field.order-1.1.27+用以设置字段的排序
field.order.with-1.1.27+用以设置字段的排序,通过比较器
field.defaultValue-1.1.11+用以设置字段的默认值
field.example-1.1.11+用以设置字段的示例值
☆field.descriptionfield1.1.11+字段的额外注释
field.ignorefield1.1.11+忽略字段(设置某些字段不出现在 json 中,或不需要请求时给出)
☆field.mockfield1.1.11+生成 mock 信息
field.mock.resolveProperty-1.1.11+用以开关是否解析field.mock规则结果中的占位符
field.namefield1.1.11+设置输出的字段名(用于 json 中字段名与类中字段名不一致)
field.requiredfield1.1.11+字段是否为必须(即不可为空)
constant.field.ignorefield1.1.11+忽略常量字段
field.schema.titlefield1.1.27+用以设置字段的数据模型的中文名
field.schema.min.lengthfield1.1.27+用以设置字段的数据模型的最小长度
field.schema.max.lengthfield1.1.27+用以设置字段的数据模型的最大长度
field.schema.formatfield1.1.27+用以设置字段的数据模型格式format
field.schema.patternfield1.1.27+用以设置字段的数据正则表达式
field.schema.constfield1.1.27+用以设置字段的数据模型常量
field.schema.read.onlyfield1.1.27+数据模型作为请求参数时,该字段将被隐藏
field.schema.write.onlyfield1.1.27+数据模型作为返回结构时,该字段将被隐藏
field.schema.permit.nullfield1.1.29+数据模型字段是否允许为 null,默认允许为 null

枚举#

规则的 key规则目标(上下文 it)版本规则描述
enum.use.customclass1.1.11+用于设置使用 @see 枚举类型时的默认取值字段, 优先级高于enum.use.by.type
enum.use.by.typeclass1.1.11+用于设置使用 @see 枚举类型时的默认使用类型一致的字段, 优先级低于enum.use.custom
enum.use.ordinalclass1.1.11+用于设置使用 @see 枚举类型时的默认使用 ordinal 作为取值
enum.use.nameclass1.1.11+用于设置使用 @see 枚举类型时的默认使用 name 作为取值

JSON 配置#

规则的 key规则目标(上下文 it)版本规则描述
☆json.rule.convert-1.1.11+用于设置某些类型转换为其他类型处理, 通常用于使用了 Spring 的自定义类型转换器的情况
json.rule.enum.convertclass1.1.11+用于枚举类型的特殊转换
json.rule.field.ignorefield1.1.11+忽略字段(设置某些字段不出现在 json 中,或不需要请求时给出) 已废弃, 使用field.ignore代替
json.rule.field.namefield1.1.11+设置输出的字段名(用于 json 中字段名与类中字段名不一致)
json.rule.class.descriptionfield1.1.29+设置数据模型的描述

methodDoc#

规则的 key规则目标(上下文 it)版本规则描述
mdoc.class.filterclass1.1.11+选择哪些类可以导出方法文档(rpc)
mdoc.method.pathmethod1.1.11+设置方法文档(rpc)的路径
mdoc.method.http.methodmethod1.1.11+设置方法文档(rpc)HTTP 请求方式

支持的简单配置#

简单配置无上下文
规则的 key版本配置类型规则描述示例
dev1.1.11+bool启动开发模式,打印更详细的日志dev=true
max.deep1.1.11+int解析json时最大深度,默认 6max.deep=8
max.elements1.1.11+int解析json时最大字段数,默认 256max.elements=512
json.cache.disable1.1.11+bool禁用json解析缓存json.cache.disable=true
http.timeOut1.1.11+inthttp请求的超时时间(s),优先级高于settinghttp.timeOut=5
auto.format.url1.1.11+bool导入时是否格式化url,确保url以/开始,且将[a-zA-Z0-9-/_:.{}?=!]之外的字符替换为/auto.format.url=false
field.mock.resolveProperty1.1.11+bool是否处理mock信息中的占位符${xxx}field.mock.resolveProperty=true
api.tags.delimiter1.1.24+stringtags的分割符, 默认为,api.tags.delimiter=,#

支持的回调#

部分回调方法中可能没有it, 但可能会有附加的上下文供使用
规则的 key规则目标(上下文 it)附加上下文版本规则描述
api.class.parse.beforeclass无1.1.11+解析api前回调
api.class.parse.afterclass无1.1.11+解析api后回调
api.method.parse.beforemethod无1.1.11+解析api方法前回调
api.method.parse.aftermethod无1.1.11+解析api方法后回调
api.param.parse.beforeparam无1.1.11+解析api参数前回调
api.param.parse.afterparam无1.1.11+解析api参数后回调
export.aftermethodapi1.1.11+每个 api 导出完成后回调
http.call.before无request1.1.11+http 请求前回调
http.call.after无request, response1.1.11+http 请求后回调
json.class.parse.beforeclass无1.1.11+解析类型前回调
json.class.parse.afterclass无1.1.11+解析类型后回调
json.field.parse.beforefield无1.1.11+解析类型字段前回调
json.field.parse.afterfield无1.1.11+解析类型字段后回调
json.method.parse.beforemethod无1.1.11+解析类型方法 (getter/setter) 前回调
json.method.parse.aftermethod无1.1.11+解析类型方法 (getter/setter) 后回调

NOTES: 项目内文件配置

规则语法#

简单规则#

# 读取注释上的 tag
如 #fake对应取的注释如下:
@ 读取注解
@xxx 读取方法或字段上的注解,如@org.springframework.web.bind.annotation.RequestMapping
@RequestMapping("path")
public class FakeClass{...}
@xxx#yyy 读取方法或字段上的注解中的 attr 值,如@org.springframework.web.bind.annotation.RequestMapping#value
@RequestMapping(value = "path")
public class FakeClass{...}
字面量
string 如: api.status=done

高级脚本规则#

由于JDK11后js引擎可能缺失, 故推荐使用groovy作为首选
groovy规则为 groovy:groovyScript
js规则为 js:jsScript

基础配置#

folder.name#

用于设置 API 所属文件夹的名称。
默认情况下, 默认使用 API 所在类作为所属文件夹。

示例#

配置如下:
# 使用 tag `folder` 设置接口所在目录
folder.name=#folder
使用如下:
默认情况下(无配置)上述接口会归属到文件夹用户相关, 加上注释 @folder 一级目录/二级目录后归属到一级目录/二级目录,如果希望成为用户相关的子目录,加上注释 @folder 用户相关/一级目录/二级目录后归属到用户相关/一级目录/二级目录 多级目录使用斜杠/分隔。其中\和/为特殊字符,需要转义,\/表示字符/,\\表示字符\。

class.prefix.path#

设置 API 请求前缀

默认推荐配置(例如.apifox-helper.properties)#

#[import_spring_properties]
#Import spring properties
###set ignoreNotFoundFile = true
###set ignoreUnresolved = true
properties.additional=${module_path}/src/main/resources/application.properties
properties.additional=${module_path}/src/main/resources/application.yml
properties.additional=${module_path}/src/main/resources/application.yaml
properties.additional=${module_path}/src/main/resources/bootstrap.yaml
properties.additional=${module_path}/src/main/resources/bootstrap.properties
properties.additional=${module_path}/src/main/resources/bootstrap.yml
###set ignoreUnresolved = false
###set ignoreNotFoundFile = false

#[resolve_spring_properties]
#Resolve spring properties
###set ignoreUnresolved = true
class.prefix.path=${server.servlet.context-path}
###set ignoreUnresolved = false

使用推荐配置后,可识别如下 spring 配置#

spring application.properties/bootstrap.properties
server.servlet.context-path=/demo
spring application.yaml/application.yml/bootstrap.yaml/bootstrap.yml
server:
  servlet:
    context-path: /demo
.apifox-helper.properties
class.prefix.path=${server.servlet.context-path}
如果 springCloud 每个模块的前缀 url 互不相同,在每个微服务的 application.properties 配置即可

自定义 demo#

class.prefix.path=/demo

ignore#

用于忽略 class/method, 不进行解析
注释在 class 上时,整个类将被忽略
注释在 method 上时,当前方法将被忽略

默认推荐配置#

ignore=#ignore

示例#

在类上注释@ignore忽略当前类
在方法上注释@ignore忽略当前 API

module#

要将 API 导入到多个 Apifox 项目时才需要配置每个 module 对应一个 Apifox 项目
默认推荐配置
module=#module

示例#

API 配置#

api.name#

用于设置 API 接口名称默认情况下, 使用 api 注释的第一行作为 API 的名称

示例#

配置如下:
# read api name from tag `api.name`
api.name=#api.name
使用如下:

示例#

api.tags#

用于设置 Apifox 的请求标签,默认情况下用,分割
在1.1.24版本之前使用api.tag,如需使用最新配置,请更新插件

示例#

配置如下:
api.tags=#tags
使用如下:

api.status#

用于设置的请求状态,默认有designing,pending,developing,integrating,testing,tested,released,deprecated,exception,obsolete

示例#

配置如下:
api.status[#obsolete]=obsolete
使用如下:

method.description#

API 接口说明,方法(API)的额外注释
在1.1.24版本之前使用method.doc,如需使用最新配置,请更新插件

默认推荐配置#

#deprecated info(java)
method.description[#deprecated]=groovy:"\n「已废弃」" + it.doc("deprecated")
method.description[@java.lang.Deprecated]=「已废弃」

method.description[groovy:it.containingClass().hasDoc("deprecated")]=groovy:"\n「已废弃」" + it.containingClass().doc("deprecated")
method.description[groovy:it.containingClass().hasAnn("java.lang.Deprecated")]=「已废弃」


#deprecated info(kotlin)
method.description[@kotlin.Deprecated]=groovy:"\n「已废弃」" + it.ann("kotlin.Deprecated","message")
method.description[groovy:it.containingClass().hasAnn("kotlin.Deprecated")]=groovy:"\n「已废弃」 " + it.containingClass().ann("kotlin.Deprecated","message")

添加对 swagger @ApiOperation 支持#

method.description=@io.swagger.annotations.ApiOperation#value

示例#

method.defaultContentType#

在1.1.24版本之前使用method.content.type,如需使用最新配置,请更新插件
用于设置 API 请求默认的content-type, 插件依然会在必要的时候强行覆盖掉
如当遇到@RequestBody时, 将被强行覆盖为application/json
默认情况下, 插件优先使用application/x-www-form-urlencoded, 如希望优先使用multipart/form-data
配置如下:
method.defaultContentType=multipart/form-data

method.default.http.method#

设置默认的 api 的 HttpMethod
默认情况下, 当 API 上未指定 HttpMethod, 且无特殊参数时默认使用GET
如希望默认使用POST
配置如下:
method.default.http.method=POST

method.request.replace#

传入参数命名方式转换规则有小驼峰 camelCase,大驼峰 pascalCase,下划线 snakeCase,全小写 flatcase,全大写 uppercase,全大写下划线 macroCase,大驼峰下划线 titleCase。此规则小于全局配置,如果想要使用请设置参数命名方式转换为保持原样
配置如下:
method.request.replace[#requestUppercase]=uppercase

示例#

导出结果如下:
名称类型是否必须默认值备注其他信息
REQUESTUPPERCASE1string
REQUESTUPPERCASE2integer

method.response.replace#

返回参数命名方式转换规则有小驼峰 camelCase,大驼峰 pascalCase,下划线 snakeCase,全小写 flatcase,全大写 uppercase,全大写下划线 macroCase,大驼峰下划线 titleCase。此规则小于全局配置,如果想要使用请设置参数命名方式转换为保持原样
配置如下:
method.response.replace[#responseUppercase]=uppercase

示例#

导出结果如下:
名称类型是否必须默认值备注其他信息
MOCK STRINGstring

method.additional.header#

API 需要额外的header

如 JWT, 所有的接口都需要在 header 中携带 token#

method.additional.header={name: "Authorization",value: "",description: "认证 Token",required:true, example:""}

如果需要排除指定开放的接口不需要 token 可以这样配置#

假定有如下注解:
则可如此配置
method.additional.header[!@com.apifox.common.annotation.Public]={name: "Authorization",value: "",description: "认证 Token",required:true}
等价于
method.additional.header[groovy:!it.hasAnn("com.apifox.common.annotation.Public")]={name: "Authorization",value: "",description: "认证 Token",required:true}

示例#


如果需要针对指定包下添加 header
method.additional.header[groovy:it.containingClass().name().startsWith("com.test.api")]={name: "Authorization",value: "",description: "认证 Token",required:true}
同理如果指定包下不需要添加 header 则取反就行了
method.additional.header[groovy:!it.containingClass().name().startsWith("com.test.api")]={name: "Authorization",value: "",description: "认证 Token",required:true}

支持添加多个 header
method.additional.header[groovy:it.containingClass().name().startsWith("com.test.api")]={name: "a",value: "",description: "",required:true}
method.additional.header[groovy:it.containingClass().name().startsWith("com.test.api")]={name: "b",value: "",description: "",required:true}

method.additional.param#

API 需要额外的param
仅适用于 url 参数,不支持form/body
例如接口都需要在param中携带 token
method.additional.param={name: "Authorization",value: "",description: "认证 Token",required:true}
如果需要排除指定开放的接口不需要 token 可以这样配置:
假定有如下注解:
则可如此配置
method.additional.param[!@com.apifox.common.annotation.Public]={name: "Authorization",value: "",description: "认证 Token",required:true, example:""}
等价于
method.additional.param[groovy:!it.hasAnn("com.apifox.common.annotation.Public")]={name: "Authorization",value: "",description: "认证 Token",required:true, example:""}

示例#

method.return#

设置方法的返回值
常用于以下情况:
方法返回 Object
方法返回类型中的泛型类型未明确<Object>/<?>/<*>
方法返回类型与实际响应无关, 例如通过操作 HttpServletResponse 来返回响应

如以下 API#

API:
这个方法返回的是void,但实际响应的是Result<UserInfo>, 所以需要通过额外的途径来表明此API的实际响应.

简单的,可做如下配置:
method.return=#response
使用方法:

为了方便书写, 我们可以尝试使用{@link}来设置实际响应类型, 利用helper.resolveLink来解析
例如做如下配置:
method.return[#response]=groovy: helper.resolveLink(it.doc("response"))
使用方法:

更进一步的, 如果所有的响应都由com.apifox.common.dto.Result包装
做如下配置:
method.return[#response]=groovy: "com.apifox.common.dto.Result<" +  helper.resolveLink(it.doc("response")) +">"
使用方法:

method.return.main#

此配置仅设置返回值的核心主体, 使得@return的注释落在主体属性上,不影响返回类型及字段.

示例#

Result.java

可做如下配置#

method.return.main[groovy:it.returnType().isExtend("com.apifox.common.dto.Result")]=data
接口示例 1:
接口代码:
导出 API 的响应:
名称类型是否必须默认值备注其他信息
msgstring非必须响应消息mock:
codeinteger非必须响应码mock: 0
datainteger非必须响应数据
当前用户类型,[用户类型]
枚举: 1,2,3
枚举备注: 1:管理员 2: 成员 3: 游客
接口示例 2:
接口代码:
导出 API 的响应:
名称类型是否必须默认值备注其他信息
msgstring非必须响应消息mock:
codeinteger非必须响应码mock: 0
+datainteger[]非必须item 类型: integer
integer枚举: 1,2,3
枚举备注: 1:管理员 2: 成员 3: 游客
附:
UserTypeConstant.java
UserType.java

method.return.body.type#

控制返回值类型,返回值类型有raw/json/xml/html/binary/msgpack/eventStream,默认返回json

可做如下配置#

method.return.body.type[#returnXml]=xml
接口示例 :
接口代码:

path.multi#

用于当 API 有多个可用路径时如何处理目前可用策略(策略不区分大小写):
可用策略策略描述
FIRST选择第一个可用路径
LAST选择最后一个可用路径
LONGEST选择最长的可用路径
SHORTEST选择最短的可用路径
ALL为每一个可用路径生成一个 api
可能的配置如下:
1.
选择第一个可用路径
path.multi=first
2.
选择最后一个可用路径
path.multi=last
3.
选择最长的可用路径
path.multi=longest
4.
选择最短的可用路径
path.multi=shortest
5.
为每一个可用路径生成一个 api
path.multi=all
也可以由 api 自行决定选择策略
path.multi=#multi
使用如下:

请求参数#

param.defaultValue#

用于设置 API 参数的默认值
在1.1.24版本之前使用param.default.value,如需使用最新配置,请更新插件

添加对 swagger @ApiParam 支持#

param.defaultValue=@io.swagger.annotations.ApiParam#defaultValue

示例#

param.description#

参数的额外注释
在1.1.24版本之前使用param.doc,如需使用最新配置,请更新插件

在注释中给出参数类型#

param.description=js:"类型:"+it.type().name()

在注释中给出参数类型并去掉 java 包名#

param.description=groovy:"类型:"+tool.uncapitalize(it.type().name().replace("java.lang.",""))
示例 API
导出结果如下:
请求参数:
参数名称是否必须示例备注
id是用户 id
类型: long
newName是新的用户名
类型: string
slogan是个人签名
类型: string
times是类型: long

param.type#

用于设置 API 参数在 HTTP 请求中的类型(位置:body/form/query)
@RequestBody/@ModelAttribute/@RequestHeader/@PathVariable等忽略此规则
参数注解有@RequestParam且HttpMehotd为GET也忽略此规则
其他不满足规则的参数在规则缺省的情况下, 优先采取query模式
在1.1.24版本之前使用param.http.type,如需使用最新配置,请更新插件

配置示例#

全设置为 form, 优先使用表单进行提交:
param.type=form
RequestParam 作为 query, 其他做为 form:
param.type[@org.springframework.web.bind.annotation.RequestParam]=query
param.type=form

param.ignore#

忽略 API 参数

添加对 swagger @ApiParam 支持#

param.ignore=@io.swagger.annotations.ApiParam#hidden

示例#

高级示例#

如果你希望自定义忽略param参数,或者使用注释的方式来忽略参数,可以使用如下配置
api.method.parse.after=groovy:```
def ig = it.doc("paramIngoreData")
def ab = tool.split(ig,",")
for(a in ab){
session.remove("json-ignore", a)
}
param.ignore=groovy:```
return session.get("json-ignore", it.name())

param.required#

用于标记 API 参数是否为必须(即不可为空)

默认推荐配置#

#Support for javax.validation annotations
param.required=@javax.validation.constraints.NotBlank
param.required=@javax.validation.constraints.NotNull
param.required=@javax.validation.constraints.NotEmpty

添加对 swagger @ApiParam 支持#

param.required=@io.swagger.annotations.ApiParam#required

示例#

MockCtrl.java

导出结果如下#

请求参数:
参数名称是否必须示例备注
seed是666666seed for mock

数据模型字段#

field.order#

用于设置字段的排序
配置如下:

示例#

TestJsonFieldBean.java
导出结果如下:
nametype
cinteger
propertyBinteger
ainteger

field.order.with#

用于设置字段的排序,与比较器类似,它通过比较两个字段返回-1、0或1,以指示结果中两个比较字段的顺序。其优先级高于field.order,一般不建议同时使用
配置如下:
1.
通过注解 JsonPropertyOrder 控制顺序
2.
子类字段优先
3.
父类字段优先
4.
按字母升序排列
5.
按字母降序排列

示例#

UserInfo.java
导出结果如下:
{
    "name": "",
    "birthDay": "", //birthday
    "age": 0, //age
    "id": 0, //user id
    "regtime": "", //registration time
    "sex": 0, //「Deprecated」It's a secret
    /**
     * 1 :Administrator
     * 2 :Member
     * 3 :Guest
     */
    "type": 0
}

field.defaultValue#

用于设置字段的默认值
在1.1.24版本之前使用field.default.value,如需使用最新配置,请更新插件

原生编码支持#

默认的所有含有默认初始值的字段, 取其默认初始值. 如:
private Integer code = 200;//响应码

额外的配置#

配置如下:
field.defaultValue=#default
DemoDto.java
导出结果如下:
名称类型是否必须默认值备注其他信息
pricenumber必须666价格

field.example#

字段示例信息
在1.1.24版本之前使用field.demo,如需使用最新配置,请更新插件

示例#

配置如下:
field.example=#example
使用如下:

field.description#

字段的额外注释

默认推荐配置#

#deprecated info(java)
field.description[#deprecated]=groovy:"\n「已废弃」" + it.description("deprecated")
field.description[@java.lang.Deprecated]=「已废弃」

#deprecated info(kotlin)
field.description[@kotlin.Deprecated]=groovy:"\n「已废弃」" + it.ann("kotlin.Deprecated","message")

添加对 swagger @ApiModelProperty 支持#

field.description=@io.swagger.annotations.ApiModelProperty#value

示例#

SwaggerModel.java

作为 API 返回值导出#

名称类型是否必须默认值备注其他信息
astring非必须666字段 A「已废弃」不再使用

field.ignore#

忽略字段(设置某些字段不出现在 json 中,或不需要请求时给出)

默认推荐配置#

#Support for Jackson annotations
field.ignore=@com.fasterxml.jackson.annotation.JsonIgnore#value

#Support for Gson annotations
field.ignore=!@com.google.gson.annotations.Expose#serialize

示例#

TestJsonIgnoreBean.java

作为 API 返回值导出#

名称类型是否必须默认值备注其他信息
shouldNotIgnoreForGsoninteger非必须mock: @natural(0,10000)
shouldNotIgnoreForJacksoninteger非必须mock: @natural(0,10000)

定制化配置示例#

忽略指定名称的字段:
配置如下:
# ignore field 'log'
field.ignore=log
将忽略如下字段:
private String log;
忽略指定类型的字段:
配置如下:
# ignore field 'log' typed xxx.xxx.Log
field.ignore=groovy:it.type().name()=="xxx.xxx.Log"
将忽略如下字段:
private Log xxx;
忽略指定modifier的字段:
配置如下:
#ignore transient field
field.ignore=groovy:it.hasModifier("transient")||it.hasModifier("protected")
将忽略如下字段:
private transient Int xxx;
protected Long yyy;

field.mock#

用于生成apifox相关 mock 信息

默认推荐配置有三部分#


允许通过注释@mock定义mock规则
#apifox mock
field.mock=#mock

示例#

DemoDto.java
作为 API 返回值导出:
名称类型是否必须默认值备注其他信息
namestring非必须用户名mock: tangcent
ageinteger非必须年龄mock: 1@natural(0,9)

通用 mock#

#mock for date

###set resolveMulti = first
java_date_types=["java.util.Date","java.sql.Timestamp","java.time.LocalDate","java.time.LocalDateTime"]
field.mock[groovy:${java_date_types}.contains(it.type().name())&&it.jsonType().name()=="java.lang.String"] = groovy:"@date"
field.mock[groovy:${java_date_types}.contains(it.type().name())&&it.jsonType().name()=="java.lang.Long"] = groovy:"@timestamp@string(\"number\", 3)"
###set resolveMulti = error

示例#

DemoDto.java
作为 API 返回值导出:
名称类型是否必须默认值备注其他信息
birthDaystring非必须生日mock: @date
regtimestring非必须注册时间mock: @date

javax.validation相关 mock
# mock for javax.validation

###set resolveMulti = first
# define var
number_min=-9999
number_max=9999
float_dmin=2
java_integer_types=["java.lang.Integer","int","java.lang.Long","long","java.lang.Short","short","java.math.BigInteger"]
java_float_types=["java.lang.Float","float","java.lang.Double","double","java.math.BigDecimal"]
# mock_integer_or_float=${java_integer_types}.contains(it.type().name())?"@integer":"@float"

# AssertTrue|AssertFalse|Email
field.mock[@javax.validation.constraints.AssertTrue]=true
field.mock[@javax.validation.constraints.AssertFalse]=false
field.mock[@javax.validation.constraints.Email]=groovy:"@email"

# Positive&PositiveOrZero
field.mock[groovy:it.hasAnn("javax.validation.constraints.Positive")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(1,${number_max})"
field.mock[groovy:it.hasAnn("javax.validation.constraints.PositiveOrZero")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,${number_max})"
field.mock[groovy:it.hasAnn("javax.validation.constraints.Positive")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0.01,${number_max},${float_dmin})"
field.mock[groovy:it.hasAnn("javax.validation.constraints.PositiveOrZero")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,${number_max},${float_dmin})"

# Negative&NegativeOrZero
field.mock[groovy:it.hasAnn("javax.validation.constraints.Negative")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(${number_min},-1)"
field.mock[groovy:it.hasAnn("javax.validation.constraints.NegativeOrZero")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(${number_min},0)"
field.mock[groovy:it.hasAnn("javax.validation.constraints.Negative")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(${number_min},0.01,${float_dmin})"
field.mock[groovy:it.hasAnn("javax.validation.constraints.NegativeOrZero")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(${number_min},0,${float_dmin})"

# Max+Min
field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&it.hasAnn("javax.validation.constraints.Min")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.Min")+","+it.ann("javax.validation.constraints.Max")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&it.hasAnn("javax.validation.constraints.Min")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.Min")+","+it.ann("javax.validation.constraints.Max")+",${float_dmin})"

# Max|Min
field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,"+it.ann("javax.validation.constraints.Max")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.Min")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.Min")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,"+it.ann("javax.validation.constraints.Max")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.Min")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.Min")+")"

# DecimalMax+DecimalMin
field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.DecimalMin")+","+it.ann("javax.validation.constraints.DecimalMax")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.DecimalMin")+","+it.ann("javax.validation.constraints.DecimalMax")+",${float_dmin})"

# DecimalMax|DecimalMin
field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,"+it.ann("javax.validation.constraints.DecimalMax")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.DecimalMin")+")"
field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,"+it.ann("javax.validation.constraints.DecimalMax")+",${float_dmin})"
field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.DecimalMin")+",${float_dmin})"

###set resolveMulti = error

示例#

ValidationDemoDto.java
作为 API 返回值导出:
名称类型是否必须默认值备注其他信息
rangeIntinteger非必须mock: @integer(666,999)
positiveOrZeroFloatnumber非必须mock: @float(0,88888888,6)
maxIntinteger非必须mock: @integer(0,999)
minIntinteger非必须mock: @integer(666)
assertFalseboolean非必须mock: false
maxDoublenumber非必须mock: @float(0,999)
minDoublenumber非必须mock: @float(666)
positiveinteger非必须mock: @integer(1,88888888)
positiveOrZerointeger非必须mock: @integer(0,88888888)
strstring必须
negativeinteger非必须mock: @integer(-888888888,-1)
rangeFloatnumber非必须mock: @float(66,9999,6)
assertTrueboolean非必须mock: true
negativeOrZerointeger非必须mock: @integer(-888888888,0)
positiveFloatnumber非必须mock: @float(0.01,88888888,6)
emailstring非必须mock: @email

field.mock.resolveProperty#

用以开关是否解析field.mock规则结果中的占位符如${float_with_two}
默认为true,如果不希望解析, 可以设置为关闭
field.mock.resolveProperty=false

使用示例#

配置如下:
#apifox mock
field.mock=#mock

#小数点后两位
float_with_two=@natural(0,10000).@natural(0,100)
DemoDto.java
导出结果
名称类型是否必须默认值备注其他信息
pricenumber必须价格mock: @natural(0,10000).@natural(0,100)

field.name#

用于设置输出/输入的字段名(用于 json 中字段名与类中字段名不一致)

默认推荐配置#

#Support for Jackson annotations
field.name=@com.fasterxml.jackson.annotation.JsonProperty#value

#Support for Gson annotations
field.name=@com.google.gson.annotations.SerializedName#value

示例#

TestJsonFieldBean.java
作为 API 返回值导出:
名称类型是否必须默认值备注其他信息
ainteger非必须mock: @natural(0,10000)
binteger非必须mock: @natural(0,10000)

配置驼峰转下划线#

#convert camel to underline
field.name=groovy:tool.camel2Underline(it.name())

field.required#

用于标记字段是否为必须(即不可为空)

默认推荐配置#

#Support for javax.validation annotations
field.required=@javax.validation.constraints.NotBlank
field.required=@javax.validation.constraints.NotNull
field.required=@javax.validation.constraints.NotEmpty

添加对 swagger @ApiModelProperty 支持#

field.required=@io.swagger.annotations.ApiModelProperty#required

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型是否必须默认值备注其他信息
ainteger必须mock: @natural(0,10000)

constant.field.ignore#

忽略常量字段

默认推荐配置#

#ignore serialVersionUID
constant.field.ignore=serialVersionUID
使用如下配置代替:
#ignore serialVersionUID
constant.field.ignore=groovy:it.name()=="serialVersionUID"

示例#

对于如下注释#

或者#

{@link com.apifox.common.constant.UserTypeConstant}

将被解析为#

枚举: 1,2,3

枚举备注: 1 :管理员 2 :成员 3 :游客

field.schema.title#

数据模型中文名称

推荐配置#

field.schema.title=#chineseName

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型是否必须中文名备注其他信息
ainteger年龄

field.schema.min.length#

数据模型高级设置最小长度

推荐配置#

field.schema.min.length=#minLength

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为patternformat
ainteger6

field.schema.max.length#

数据模型高级设置最大长度

推荐配置#

field.schema.max.length=#maxLength

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为patternformat
ainteger6

field.schema.format#

数据模型高级设置format

推荐配置#

field.schema.format=#format

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为patternformat
aintegerinteger<long>

field.schema.pattern#

数据模型高级设置用正则表达式约束字符串

推荐配置#

field.schema.pattern=#pattern

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为patternformat
astring^\d{3}$

field.schema.const#

数据模型高级设置常量

推荐配置#

field.schema.const=#const

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为pattern常量
astringtest

field.schema.read.only#

数据模型高级设置只读行为,数据模型用作请求参数时,该字段将会被隐藏

推荐配置#

field.schema.read.only=#readOnly

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为pattern常量
astringRead Only

field.schema.write.only#

数据模型高级设置只读行为,数据模型用作返回结构时,该字段将会被隐藏

推荐配置#

field.schema.write.only=#writeOnly

示例#

SwaggerModel.java
作为 API 返回值导出:
名称类型最小长度最大长度行为pattern常量
astringWrite Only

field.schema.permit.null#

数据模型高级设置是否允许为 null,默认允许为 null

推荐配置#

field.schema.permit.null=@javax.validation.constraints.NotBlank

枚举#

enum.use.custom#

用于设置使用@see枚举类型时的默认取值字段
假定有如下枚举类
对于如下字段

默认情况#

由于 UserType 中不存在字段 type, 默认情况下这里的@see UserType 会被忽略掉

增加配置#

做如下配置,设置@see UserType时默认使用code字段作为取值
enum.use.custom[com.apifox.common.constant.UserType]=code
则上述注释将等价于
导出 API 结果为:
名称类型是否必须默认值备注其他信息
typeinteger非必须用户类型枚举: 1,2,3
枚举说明: 1: 管理员 2: 成员 3: 游客

统一处理#

特殊的, 声明如下接口:
改造UserType,使其继承BaseEnum
则可做如下配置,将所有继承BaseEnum的类默认使用code字段作为取值
enum.use.custom[groovy:it.isExtend("com.apifox.common.constant.BaseEnum")]=code

enum.use.by.type#

默认使用类型一致的字段, 优先级低于enum.use.custom
假定有如下枚举类
对于如下字段
推荐配置中有
enum.use.by.type=true
上述注释将被处理为:
导出 API 结果为:
名称类型是否必须默认值备注其他信息
typeinteger非必须用户类型枚举: 1,2,3
枚举说明: 1: 管理员 2: 成员 3: 游客

enum.use.ordinal#

用于设置使用@see枚举类型时的默认使用ordinal作为取值
优先级低于enum.use.custom和enum.use.by.type
所以要使用enum.use.ordinal需要先在推荐配置中取消enum.use.by.type
假定有如下枚举类
对于如下字段

默认情况#

由于 UserType 中不存在字段 type, 默认情况下这里的@see UserType会被忽略掉

增加配置#

做如下配置, 设置@see UserType时默认使用ordinal字段作为取值
enum.use.ordinal[com.apifox.common.constant.UserType]=true
则上述注释将等价于
导出 API 结果为:
名称类型是否必须默认值备注其他信息
typeinteger非必须用户类型枚举: 1,2,3
枚举说明: 1: 管理员 2: 成员 3: 游客

统一处理#

特殊的, 声明如下接口:
改造UserType,使其继承BaseEnum
则可做如下配置, 将所有继承BaseEnum的类默认使用ordinal作为取值
enum.use.ordinal[groovy:it.isExtend("com.apifox.common.constant.BaseEnum")]=true

整个项目所有@see枚举类都默认使用ordinal作为取值#

enum.use.ordinal=true

enum.use.name#

用于设置使用@see枚举类型时的默认使用name作为取值
优先级低于enum.use.custom和enum.use.by.type
所以要使用enum.use.name需要先在推荐配置中取消enum.use.by.type
假定有如下枚举类
对于如下字段

默认情况#

由于 UserType 中不存在字段 type, 默认情况下这里的@see UserType会被忽略掉

增加配置#

做如下配置, 设置@see UserType时默认使用name字段作为取值
enum.use.name[com.apifox.common.constant.UserType]=true
则上述注释将等价于
导出 API 结果为:
名称类型是否必须默认值备注其他信息
typestring非必须用户类型枚举: ADMIN, MEMBER, GUEST
枚举备注: ADMIN: 管理员 MEMBER: 成员 GUEST: 游客

统一处理#

特殊的, 声明如下接口:
改造UserType,使其继承BaseEnum
则可做如下配置,将所有继承BaseEnum的类默认使用name作为取值
enum.use.name[groovy:it.isExtend("com.apifox.common.constant.BaseEnum")]=true

整个项目所有@see枚举类都默认使用name作为取值#

enum.use.name=true

JSON 配置#

json.rule.convert#

用于设置某些类型转换为其他类型处理, 通常用于使用了 Spring 的自定义类型转换器的情况

默认推荐配置#

#The ObjectId and Date are parsed as strings
json.rule.convert[org.bson.types.ObjectId]=java.lang.String
json.rule.convert[java.util.Date]=java.lang.String
json.rule.convert[java.sql.Timestamp]=java.lang.String
json.rule.convert[java.time.LocalDateTime]=java.lang.String
json.rule.convert[java.time.LocalDate]=java.lang.String

#resolve HttpEntity/RequestEntity/ResponseEntity
###set resolveProperty = false
json.rule.convert[#regex:org.springframework.http.HttpEntity]=java.lang.Object
json.rule.convert[#regex:org.springframework.http.HttpEntity<(.*?)>]=${1}
json.rule.convert[#regex:org.springframework.http.RequestEntity<(.*?)>]=${1}
json.rule.convert[#regex:org.springframework.http.RequestEntity]=java.lang.Object
json.rule.convert[#regex:org.springframework.http.ResponseEntity<(.*?)>]=${1}
json.rule.convert[#regex:org.springframework.http.ResponseEntity]=java.lang.Object
###set resolveProperty = true

json.rule.enum.convert#

用于设置枚举类型的转换 优先级低于json.rule.convert
假定有如下枚举类
对于如下字段

默认情况#

默认将枚举类型转换为String处理,给出可用值为枚举中的实例名
上述字段将被处理为
导出 API 结果为:
名称类型是否必须默认值备注其他信息
typestring非必须用户类型枚举: ADMIN,MEMBER,GUEST
枚举备注: ADMIN :管理员 MEMBER :成员 GUEST :游客

增加配置#

做如下配置,将其转换为int处理,给出可用值为枚举中的type字段
json.rule.enum.convert[com.apifox.common.constant.UserType]=~#type
则上述字段将被处理为
导出 API 结果为:
名称类型是否必须默认值备注其他信息
typeinteger非必须用户类型枚举: 1,2,3
枚举备注: 1 :管理员 2 :成员 3 :游客

统一处理#

特殊的, 声明如下接口:
改造UserType,使其继承TypeAble
则可做如下配置,将所有继承TypeAble的类转换为int处理,给出可用值为枚举中的type字段
json.rule.enum.convert[groovy:it.isExtend("com.apifox.common.constant.TypeAble")]=~#type

json.rule.field.ignore#

忽略字段(设置某些字段不出现在 json 中,或不需要请求时给出)
deprcated, see field.ignore

默认推荐配置#

#Support for Jackson annotations
json.rule.field.ignore=@com.fasterxml.jackson.annotation.JsonIgnore#value

#Support for Gson annotations
json.rule.field.ignore=!@com.google.gson.annotations.Expose#serialize

示例#

TestJsonIgnoreBean.java
作为 API 返回值导出:
名称类型是否必须默认值备注其他信息
shouldNotIgnoreForGsoninteger非必须mock: @natural(0,10000)
shouldNotIgnoreForJacksoninteger非必须mock: @natural(0,10000)

定制化配置示例#

忽略指定名称的字段: 配置如下:
# ignore field 'log'
json.rule.field.ignore=log
将忽略如下字段:
private String log;
忽略指定类型的字段:
配置如下:
# ignore field 'log' typed xxx.xxx.Log
json.rule.field.ignore=groovy:it.type().name()=="xxx.xxx.Log"
将忽略如下字段:
private Log xxx;
忽略指定 modifier 的字段:
配置如下:
#ignore transient field
json.rule.field.ignore=groovy:it.hasModifier("transient")||it.hasModifier("protected")
将忽略如下字段:
private transient Int xxx;
protected Long yyy;

json.rule.field.name#

用于设置输出/输入的字段名(用于 json 中字段名与类中字段名不一致)

默认推荐配置#

#Support for Jackson annotations
json.rule.field.name=@com.fasterxml.jackson.annotation.JsonProperty#value

#Support for Gson annotations
json.rule.field.name=@com.google.gson.annotations.SerializedName#value

示例#

TestJsonFieldBean.java

作为 API 返回值导出#

名称类型是否必须默认值备注其他信息
ainteger非必须mock: @natural(0,10000)
binteger非必须mock: @natural(0,10000)

json.rule.class.description#

用于设置类的描述信息

推荐配置#

json.rule.class.description[#class.desc]=@io.swagger.annotations.ApiModel#description

示例#

User.java

methodDoc#

mdoc.class.filter#

用于选择哪些类可以导出方法(rpc)文档, 根据当前项目情况

示例#

如果所有的 RPC 接口类都以Client结尾, 则可配置:
mdoc.class.filter=groovy:it.name().endsWith("Client")
如果所有的 RPC 接口类包都在a.b.c.client, 则可配置:
mdoc.class.filter=groovy:it.name().startsWith("a.b.c.client")

mdoc.method.path#

用于设置方法文档(rpc)的路径
为了防止重载方法覆盖,默认生成的 path 后加上了参数信息: $className/$methodName/$args
根据项目情况, 可自行配置以简化路径长度

修改默认行为#

假设有如下类
默认情况下
导出的路径为:
/com.apifox.dubbo.demo.client.UserClient/set/long/java.lang.String/java.lang.String/long/
如果确认无重载方法, 可以尝试去掉参数信息:
配置如下:
mdoc.method.path=groovy:it.containingClass().name()+"/"+it.name()
导出的接口路径为: /com.apifox.dubbo.demo.client.UserClient/set
可以尝试去掉包名:
配置如下:
mdoc.method.path=groovy:it.containingClass().getSimpleName()+"/"+it.name()
导出的接口路径为: /UserClient/set
可以进一步将类名转换为小写:
配置如下:
mdoc.method.path=groovy:it.containingClass().getSimpleName().toLowerCase()+"/"+it.name()
导出的接口路径为: /userclient/update

mdoc.method.http.method#

设置方法文档(rpc)HTTP 请求方式, 默认POST

修改默认行为#

将无参方法设置为GET
配置如下:
mdoc.method.http.method=groovy:it.argCnt()==0?"GET":null

支持的回调#

export.after#

每个 api 导出完成后回调
规则目标(上下文 it)附加上下文
methodapi

示例#

增加接口描述信息
header 中 token 不需要显示传参
修改 url
response 的 header 中会返回当前用户会员等级
将 method 上的@version xxx加入到url中

http.call.after#

http 请求后回调
注意:插件所有的http请求都将触发此回调
规则目标(上下文 it)附加上下文
无request, response

示例#

记录插件所有的请求的响应
http.call.after=groovy:logger.info("response:"+response.string())
某个接口请求成功后执行其他接口
http.call.after=groovy:```
//判断是不是指定接口
if(request.code()==200&&request.url().endsWith("/xxx")){
    httpClient.post("http://xxx/xxx")
    .contentType("application/json")
    .body({"xxx":"xxx","xxx":"xxx"})
    .call()
}
```
Call自动登录(Cookie)
http.call.after=groovy:```
//判断是不是需要登录的接口
if(response.code()==401){
    httpClient.post("http://xxx/login")
        .contentType("application/json")
        .body({"username":"xxx","passwd":"xxx"})
        .call()
    response.discard()//丢弃这一次的请求结果
}
```
Call自动登录(Token)
http.call.after=groovy:```
//判断是不是需要登录的接口
if(response.code()==401){
    def loginResponse = httpClient.post("http://xxx/login")
        .contentType("application/json")
        .body({"username":"xxx","passwd":"xxx"})
        .call()
    def token = loginResponse.firstHeader("token")
    localStorage.set("token",token)
    response.discard()//丢弃这一次的请求结果
}
```
http.call.before=groovy:```
//从 localStorage 取 token
request.header("token",localStorage.get("token"))
```

host不固定
//可以尝试通过正则获取当前请求的 host
def host = regex.getGroup1("(https?://.+?)/.*?",request.url());
x-www-form-urlencoded提交
httpClient.post("http://xxx/login")
    .contentType("application/x-www-form-urlencoded")
    .param("username","name")
    .param("password","pwd")
    .call();

http.call.before#

http 请求前回调
注意:插件所有的http请求都将触发此回调
规则目标(上下文 it)附加上下文
无request

示例#

记录插件所有的请求
自动加入指定 token
自动加入从 localStorage 获取的 token

api.class.parse.before#

解析 controller 类前回调
规则目标(上下文 it)附加上下文
class无

示例#

增加 log

api.class.parse.after#

解析 controller 类后回调
规则目标(上下文 it)附加上下文
class无

示例#

增加 log

api.method.parse.before#

解析 api 方法前回调
规则目标(上下文 it)附加上下文
method无

示例#

增加 log

api.method.parse.after#

解析 api 方法后回调
规则目标(上下文 it)附加上下文
method无

示例#

增加 log

api.param.parse.before#

解析 api 参数前回调
规则目标(上下文 it)附加上下文
param无

示例#

增加 log

api.param.parse.after#

解析 api 参数后回调
规则目标(上下文 it)附加上下文
param无

示例#

增加 log

json.class.parse.before#

解析类型前回调
规则目标(上下文 it)附加上下文
class无

示例#

增加 log

json.class.parse.after#

解析类型后回调
规则目标(上下文 it)附加上下文
class无

示例#

增加 log

json.field.parse.before#

解析属性(字段)前回调
规则目标(上下文 it)附加上下文
field无

示例#

增加 log

json.field.parse.after#

解析属性(字段)后回调
规则目标(上下文 it)附加上下文
field无

示例#

增加 log

json.method.parse.before#

解析 getter/setter 方法前回调
规则目标(上下文 it)附加上下文
method无

示例#

增加 log

json.method.parse.after#

解析 getter/setter 方法后回调
规则目标(上下文 it)附加上下文
method无

示例#

增加 log
修改于 2025-01-07 07:06:16
上一页
项目内配置
下一页
脚本工具
Built with