對於app開發來講,必須須要有相應的api文檔,通常最基礎的就是用markdown工具來撰寫api文檔。當對於開發人員來講,是總會想着尋找更方便撰寫,測試,對接前端開發的文檔生成的工具。html
其實這方面的工具不少:手動撰寫的也不少,不少都帶有mock測試功能。方便前端對接時使用。前端
國內的也很多:html5
RAP:動態生成模擬數據,實時測試等功能。java
eoLinker:基於雲端的api管理工具,同時提供在線協做,測試等的功能。mysql
SBDoc:SBDoc是一個商業化開源產品,徹底免費。不管你是前端工程師,仍是後端工程師,接口永遠都是二者交互的橋樑,因此SBDoc專爲中小型團隊量身打造,旨在解決接口的管理,測試與數據生成,實現真正的一體化解決方案。git
Apizza - 爲極客打造的api管理工具。github
easyApi:有分免費和收費,但只支持在線版本的api管理。web
CrapApi:一個由anjularjs+bootstrap+springMVC搭建的免費開源的API接口、文檔管理系統(應用接口管理系統)。redis
showDoc:國內的api 管理工具,比較簡潔。https://www.showdoc.cc/demo?page_id=10spring
小幼雞:也是api 管理工具,差很少,本身能夠比較試用,小幺雞,簡單好用的在線接口文檔管理系統
NEI:團隊協做工具,其實也是在文檔等包括api接口的測試等的工具。https://nei.netease.com/
apiview:很少說就是一個工具。https://www.apiview.com/
apidoc:apidoc能夠根據代碼註釋生成web api;沒什麼侵入性,但是學習成本稍微高點,要了解不少註釋裏使用到的註解
外國的Swagger 是一款java的api 生成工具,不過是代碼侵入的形式,功能是很強大啊。但是代碼裏要加不少註解,讓人彆扭。
WSO2 API Management : 是比較好的api管理框架吧!
固然還有不少這種api管理工具,基本都是在雲應用上,至少都有免費的。最好尋找離線的工具,能夠在本地部署使用爲最優了。
==========================================================================
下面重點介紹的是spring-rest-docs的使用。
spring-rest-docs是一個測試驅動的spring組件,他能生成測試成功的接口進行文檔生成,支持markdown的轉換或者html的轉化,對於文檔對接,其實也夠了,缺點就是沒法像其餘工具那樣模擬測試數據,前端在對接的時候,能夠直接調用模擬數據,尤爲對於趕進度的接口,多是先寫接口,再寫實現,那麼這樣的話,就有點不適合。
但他的強大之處,就是能夠自動生成文檔,並且是通過測試過的接口,減去一些沒必要要的撰寫工做,相對於Swagger來講,沒有任何代碼的依賴侵入。因此在實際的spring那套開發框架下,仍是建議使用,他確實很不錯。若是真的須要用到其餘系統化的api管理工具,能夠把markdown再導入到管理工具中去,便可。
另外apidoc 也不錯,也是能夠考慮使用的。
--------------------------------------------------------------------------------
spring-boot 整合 spring-rest-docs
1,pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ouyang</groupId> <artifactId>boss</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>boss</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-mockmvc</artifactId> <scope>test</scope> </dependency> <!-- java-web-token 驗證受權--> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <includes> <include>**/*Test.java</include> </includes> </configuration> </plugin> <plugin> <groupId>org.asciidoctor</groupId> <artifactId>asciidoctor-maven-plugin</artifactId> <version>1.5.2</version> <executions> <execution> <id>generate-docs</id> <phase>prepare-package</phase> <goals> <goal>process-asciidoc</goal> </goals> <configuration> <backend>html</backend> <doctype>book</doctype> <attributes> <snippets>${project.build.directory}/generated-snippets</snippets> </attributes> <!-- <sourceDirectory>src/docs/asciidocs</sourceDirectory> <outputDirectory>target/generated-docs</outputDirectory>--> </configuration> </execution> </executions> </plugin> <!--<plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-resources</id> <phase>prepare-package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory> ${project.build.outputDirectory}/static/docs </outputDirectory> <resources> <resource> <directory> ${project.build.directory}/generated-docs </directory> </resource> </resources> </configuration> </execution> </executions> </plugin>--> </plugins> </build> </project>
2,寫測試類
@RunWith(SpringRunner.class) @WebMvcTest(TestController.class) @AutoConfigureRestDocs(outputDir = "target/generated-snippets") public class SpringRest2 { @Autowired private MockMvc mockMvc; @Test public void shouldReturnDefaultMessage() throws Exception { this.mockMvc.perform(get("/xiaofeng").param("xiaobing", "Tester").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(document("index2", requestParameters( parameterWithName("xiaobing").description("xiaobing is autoSelected avaible")))); } // @Test // public void shouldReturnDefaultMessage2() throws Exception { // this.mockMvc.perform(get("/api/liu").accept(MediaType.APPLICATION_JSON)) // .andExpect(status().isOk()) // .andDo(document("index")); // } }
3,進行junit測試後在target目錄下會生成
而後再手動配置接口展現的文檔:
這裏須要創建相應的文檔,並創建index.adoc文件。{snippets} 就是你配置在asciidoctor-maven-plugin插件裏的snippets屬性
4,生成html文檔
在控制檯輸入: mvnw package (或者mvn package)
會在target/generated-docs 裏面生成對應的html文檔。
還有更好的用法,能夠查看官方文檔:
http://docs.spring.io/spring-restdocs/docs/1.1.0.RELEASE/reference/html5/
intellj能夠按照asciiDoc插件 方便查看文檔
參考:spring-rest-docs https://github.com/sumit-samaddar/spring-rest-docs
官方地址:http://docs.spring.io/spring-restdocs/docs/1.1.0.RELEASE/reference/html5/