之前写了在 JBolt 中集成 JApiDocs 的分享(传送门)。满足给前端对接接口人员查看 api 文档的需求。
有时后端或前端有执行接口的需求,看看返回值、验证下接口等。所以,需要导出 postman 格式文件,然后 import 到 postman 或类似 apifox、apipost 工具中。
好在 JApiDocs 提供了插件机制,直接上代码。
package com.hccx.common.japidocs; import freemarker.template.Template; import freemarker.template.TemplateException; import io.github.yedaxia.apidocs.DocContext; import io.github.yedaxia.apidocs.IPluginSupport; import io.github.yedaxia.apidocs.Resources; import io.github.yedaxia.apidocs.Utils; import io.github.yedaxia.apidocs.parser.ControllerNode; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; public class PostmanDocPlugin implements IPluginSupport { public PostmanDocPlugin() { } public void execute(List<ControllerNode> controllerNodeList) { FileWriter docFileWriter = null; try { Template ctrlTemplate = this.getDocTpl(); String docFileName = String.format("%s-%s-api-docs.json", DocContext.getDocsConfig().getProjectName(), DocContext.getDocsConfig().getApiVersion()); File docFile = new File(DocContext.getDocPath(), docFileName); docFileWriter = new FileWriter(docFile); Map<String, Object> data = new HashMap(); data.put("controllerNodes", controllerNodeList); data.put("currentApiVersion", DocContext.getCurrentApiVersion()); data.put("projectName", DocContext.getDocsConfig().getProjectName()); data.put("i18n", DocContext.getI18n()); ctrlTemplate.process(data, docFileWriter); } catch (IOException | TemplateException var10) { var10.printStackTrace(); } finally { Utils.closeSilently(docFileWriter); } } private Template getDocTpl() throws IOException { return Resources.getFreemarkerTemplate("postman-doc.json.ftl"); } }
postman-doc.json.ftl 模板文件放在 resources 目录下。
{ "info": { "_postman_id": "", "name": "${projectName}", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ <#list controllerNodes as controller> { "name": "${controller.description}", "item": [ <#list controller.requestNodes as reqNode> { "name": "${reqNode.description}", "request": { "header": [{ "key": "JBOLTAPI", "value": "true", "type": "text" }, { "key": "jboltappid", <#if reqNode.url?contains("wxa")> "value": "{{wxa_appid}}", <#else> "value": "{{app_appid}}", </#if> "type": "text" }, { "key": "jboltjwt", "value": "{{app_jwt}}", "type": "text" } ], "url": { "raw": "{{domain}}${reqNode.url}", "query": [ <#if reqNode.paramNodes?size != 0> <#list reqNode.paramNodes as paramNode> { "key": "${paramNode.name}", "value": "", "description": "${paramNode.description}" }<#if paramNode_has_next>,</#if> </#list> </#if> ] } } }<#if reqNode_has_next>,</#if> </#list> ] }<#if controller_has_next>,</#if> </#list> ] }
其中 {{domain}} 是 postman 等接口测试工具中设置的环境变量。
其中 header 部分,是为了方便 JBolt 的 jwt 接口鉴权添加的,如果不需要可以去掉。
"header": [{ "key": "JBOLTAPI", "value": "true", "type": "text" }, { "key": "jboltappid", <#if reqNode.url?contains("wxa")> "value": "{{wxa_appid}}", <#else> "value": "{{app_appid}}", </#if> "type": "text" }, { "key": "jboltjwt", "value": "{{app_jwt}}", "type": "text" } ],
在 JApiDocsGenerator.java 中添加一句即可 config.addPlugin(new PostmanDocPlugin());。
/** * JApiDocs 无需额外注解的 API 文档生成工具 * <p> * 源码 https://github.com/YeDaxia/JApiDocs * 文档 https://japidocs.agilestudio.cn/#/zh-cn/ * * @author zxd 2022-02-17 */ public class JApiDocsGenerator { /** * JApiDocs 生成器 * 如果报错,做如下检查: * 1 javadoc @param 后是否有注释 * 2 src.main.java 目录中非 .java 扩展名文件的内容要 // 注释起来 * 3 删除 config.setDocsPath 目录中的文件,再生成试试 * <p> * 如果生成的 api 文档不是预期的,作如下检查: * 1 必须在 configRoute(Routes me) 中已该方式 me.add("/xx/yy", xx.class, "/"); 定义 Controller * 2 在需要生成 api 的 Controller 中添加 @ApiDoc 注解 * 3 如果要忽略某 action,在 action 上添加 @Ignore */ public static void main(String[] args) { DocsConfig config = new DocsConfig(); config.setProjectPath("f:/zxd_workspace/used_car/src"); // root project path config.setProjectName("used_car"); // project name config.setApiVersion("v1.0"); // api version config.setDocsPath("f:/zxd_workspace/used_car/src/main/webapp/assets/apidocs"); // api docs target path config.addPlugin(new PostmanDocPlugin()); config.setAutoGenerate(Boolean.FALSE); // auto generate //config.setMvcFramework("JFinal"); Docs.buildHtmlDocs(config); // execute to generate } }
在 config.setDocsPath 设置的目录中能找到 used_car-v1.0-api-docs.json ,将其导入到 postman 或 apifox 中。
我使用的是 apifox,看下效果。