背景概要 公司的spirng项目使用swagger2来生成线上的Restful API文档,现在需要方便的把最新的api同步到公司wiki中。因此,需要把swagger已经生成的api文档格式化成wiki能支持的格式。
解决方案 使用swagger-ui生成api文档 这部分工作之前就完成了,需要注意的是,之前的swagger
注解不够规范,很多参数和返回结果没有定义清晰的schema。
为此,需要加入ApiModelProperty
对实体(Request
和Response
)进行注解和说明。这样生成的API文档才能有清晰的desc。 另外我加入了example,方便前端同学测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class DemoQueryRequest extends BaseListRequest { @ApiModelProperty (value = "媒体渠道英文" , example = "sinanewsapp" ) private String appCode; @ApiModelProperty (value = "文案模糊匹配" , example = "瘦身" ) private String titleLike; @ApiModelProperty (value = "创意图数量" , example = "2" , allowableValues = "{1, 2, 3}" ) private Integer imageCount; @ApiModelProperty (value = "行业" , example = "医疗健康" ) private String manualType; }
使用插件生成静态文档
1 compile group : 'io.github.swagger2markup' , name: 'swagger2markup' , version: '1.3.3'
选择参考文章中的方法,使用一个UnitTest来生成静态文档,由于有些自定义的操作,所以不采用plugin的方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 package com._4paradigm.demo..api;import io.github.swagger2markup.Swagger2MarkupConfig;import io.github.swagger2markup.Swagger2MarkupConverter;import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder;import io.github.swagger2markup.markup.builder.MarkupLanguage;import io.swagger.models.Swagger;import io.swagger.parser.SwaggerParser;import org.apache.commons.collections.CollectionUtils;import org.apache.commons.io.FileUtils;import org.assertj.core.util.Lists;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.io.File;import java.io.IOException;import java.net.URL;import java.nio.file.Paths;import java.util.Collections;import java.util.List;@RunWith (SpringRunner.class ) @SpringBootTest (classes = {DemoApiApplicationContext.class }) public class ApiDocTest { private static final String DOC_DIR = "docs/wiki/generated" ; @Test public void generateWikiDocs () throws Exception { Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP) .withGeneratedExamples() .build(); Swagger2MarkupConverter.from(new URL("http://localhost:8065/v2/api-docs" )) .withConfig(config) .build() .toFolder(Paths.get(DOC_DIR)); generateOneWikiDoc(); } private List<String> getWikiList (String wikiFileName) { try { List<String> list = FileUtils.readLines(new File(wikiFileName)); if (CollectionUtils.isNotEmpty(list)) { List<String> filtedList = Lists.newArrayList(); list.forEach(line -> { if (line.indexOf("{code:language=json}" ) >= 0 ) { line = line.replaceAll("code:language=json" , "code:language=js" ); } filtedList.add(line); }); return filtedList; } else { return Collections.EMPTY_LIST; } } catch (IOException e) { e.printStackTrace(); } return Collections.EMPTY_LIST; } private void generateOneWikiDoc () { List<String> finalList = Lists.newArrayList(); String toc = "{toc:maxLevel=3}" ; String splitLine = "----" ; finalList.add(toc); finalList.addAll(getWikiList(DOC_DIR + "/overview.txt" )); finalList.add(splitLine); finalList.addAll(getWikiList(DOC_DIR + "/paths.txt" )); finalList.add(splitLine); finalList.addAll(getWikiList(DOC_DIR + "/definitions.txt" )); finalList.add(splitLine); finalList.addAll(getWikiList(DOC_DIR + "/security.txt" )); finalList.add(splitLine); try { FileUtils.writeLines(new File(DOC_DIR + "/wiki.txt" ), finalList); } catch (IOException e) { e.printStackTrace(); } } }
运行unit test
至此将在docs/wiki/generated/
目录下生成wiki.txt
将wiki.txt中的内容copy到wiki编辑器中即可
参考文献 使用Swagger2Markup生成静态文档: https://blog.csdn.net/daijiguo/article/details/81350169