摘要:導讀在團隊協(xié)作的時候許多時候需要用到接口文檔,我們通常通過手工編寫大量重復格式的文檔,讓我想起了程序員最討厭的兩件事沒有文檔,編寫文檔。對應(yīng)的資料可自行谷歌。關(guān)于和官網(wǎng)是這樣描述的。我們可以理解為為基于構(gòu)建的自動生成文檔。
導讀:
在團隊協(xié)作的時候許多時候需要用到接口文檔,我們通常通過手工編寫大量重復格式的文檔,讓我想起了程序員最討厭的兩件事:沒有文檔,編寫文檔。哈哈,如果使用過swagger的朋友應(yīng)該都很了解它帶給我們的便利,如果你還沒有使用swagger的話,正好打算編寫RESTful API文檔,這里有一篇文章Spring Boot中使用Swagger2構(gòu)建強大的RESTful API文檔可以幫助你在較短的時間內(nèi)構(gòu)建出一個線上文檔,有些時候我們需要生成離線文檔有該怎么做呢?帶著這個問題我們一起去出發(fā)。
關(guān)于swagger:Swagger - 前后端分離后的契約
通過Swagger進行API設(shè)計,與Tony Tam的一次對話
一個簡短的總結(jié),更好的生成RESTful API文檔,提供相應(yīng)的測試功能,效果圖如下:
編寫離線文檔:swagger為我們提供了生成在線文檔的功能,然而有些時候客戶需要的是離線文檔的api,有沒有什么較好的辦法可以通過swagger幫助我們生成離線文檔呢?
這就是今天的主角:Springfox和Spring Rest Docs幫我們做的事情
1.預備知識:
建議了解swagger、Asciidoc、asciidoctor-maven-plugin和SpringBoot Testing。對應(yīng)的資料可自行谷歌。
2.關(guān)于Springfox和Spring Rest Docs:
官網(wǎng)是這樣描述的Springfox:Automated JSON API documentation for API"s built with Spring。我們可以理解為為 基于Spring構(gòu)建的API自動生成文檔。
其實我們的思路就是把swagger在線文檔轉(zhuǎn)成staticdocs形式的文檔,引入相關(guān)的一些依賴 Spring Rest Docs的依賴spring-restdocs-mockmvc,離線文檔的依賴springfox-staticdocs,因為要在單元測試的時候生成文檔,所以再加測試相關(guān)的spring-boot-starter-test。
使用Maven插件:org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test io.springfox springfox-swagger2 2.6.1 io.springfox springfox-swagger-ui 2.6.1 org.springframework.restdocs spring-restdocs-mockmvc 1.1.2.RELEASE test io.springfox springfox-staticdocs 2.6.1 com.alibaba fastjson 1.2.8
我們使用asciidoctor-maven-plugin插件將Asciidoc格式轉(zhuǎn)成HTML5格式
了解更多: 使用介紹
編寫測試類生成離線文檔:org.asciidoctor asciidoctor-maven-plugin ${asciidoctor.html.output.directory} index.adoc book left 3 ${generated.asciidoc.directory} output-html test process-asciidoc html ${project.build.directory}/generated-snippets
import cn.sunxyz.domain.UserInfo; import com.alibaba.fastjson.JSON; import io.github.robwin.markup.builder.MarkupLanguage; import io.github.robwin.swagger2markup.GroupBy; import io.github.robwin.swagger2markup.Swagger2MarkupConverter; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import springfox.documentation.staticdocs.SwaggerResultHandler; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @AutoConfigureMockMvc @AutoConfigureRestDocs(outputDir = "target/generated-snippets") @RunWith(SpringRunner.class) @SpringBootTest public class DocumentationBuild { private String snippetDir = "target/asciidoc/generated-snippets"; private String outputDir = "target/asciidoc"; @Autowired private MockMvc mockMvc; @After public void Test() throws Exception { // 得到swagger.json,寫入outputDir目錄中 mockMvc.perform(get("/v2/api-docs").accept(MediaType.APPLICATION_JSON)) .andDo(SwaggerResultHandler.outputDirectory(outputDir).build()) .andExpect(status().isOk()) .andReturn(); // 讀取上一步生成的swagger.json轉(zhuǎn)成asciiDoc,寫入到outputDir // 這個outputDir必須和插件里面標簽配置一致 Swagger2MarkupConverter.from(outputDir + "/swagger.json") .withPathsGroupedBy(GroupBy.TAGS)// 按tag排序 .withMarkupLanguage(MarkupLanguage.ASCIIDOC)// 格式 .withExamples(snippetDir) .build() .intoFolder(outputDir);// 輸出 } @Test public void TestApi() throws Exception { mockMvc.perform(get("/api/user/1") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(MockMvcRestDocumentation.document("查詢用戶", preprocessResponse(prettyPrint()))); UserInfo userInfo = new UserInfo(); userInfo.setName("lisi"); userInfo.setAge(23); userInfo.setAddress("山東濟南"); userInfo.setSex("男"); mockMvc.perform(post("/api/user").contentType(MediaType.APPLICATION_JSON) .content(JSON.toJSONString(userInfo)) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().is2xxSuccessful()) .andDo(MockMvcRestDocumentation.document("新增用戶", preprocessResponse(prettyPrint()))); } }
由于前面已經(jīng)配置了maven的插件,只需要執(zhí)行測試就可以生成相應(yīng)的文檔, 效果圖如下:
補充:Swagger配置:
@Configuration @EnableSwagger2 public class SwaggerConfiguration { @Bean public Docket configSpringfoxDocket_all(ApiInfo apiInfo) { return new Docket(DocumentationType.SWAGGER_2) .produces(Sets.newHashSet("application/json")) .consumes(Sets.newHashSet("application/json")) .protocols(Sets.newHashSet("http", "https")) .apiInfo(apiInfo) .forCodeGeneration(true) .select().paths(regex("/api.*")) .build(); } @Bean public Docket createUserInfoRestApi(ApiInfo apiInfo) { return new Docket(DocumentationType.SWAGGER_2) .groupName("user") .produces(Sets.newHashSet("application/json")) .consumes(Sets.newHashSet("application/json")) .protocols(Sets.newHashSet("http", "https")) .apiInfo(apiInfo) .select() .apis(RequestHandlerSelectors.basePackage("cn.sunxyz.controller")) .paths(regex("/api/user.*")) .build(); } @Bean public ApiInfo apiInfo() { return new ApiInfoBuilder().title("Springfox REST API") .description("Descriptions.") .termsOfServiceUrl("http://springfox.io") .license("Apache License Version 2.0") .licenseUrl("https://github.com/springfox/springfox/blob/master/LICENSE") .version("2.0") .build(); } }
相關(guān)源碼已托管github
參考資料:
Spring REST Docs
SpringBoot項目生成RESTfull API的文檔
Introduction to Spring REST Docs
asciidoctor-maven-plugin
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70000.html
摘要:以下內(nèi)容基于如果你使用的也是相同的技術(shù)棧可以繼續(xù)往下閱讀,如果不是可以當作參考。編寫的四種方式裸寫最簡單最粗暴也是使用最多的一種方式,在寫的多了之后可以用生成工具生成。 導讀 在目前接觸過的項目中大多數(shù)的項目都會涉及到: crud相關(guān)的操作, 哪如何優(yōu)雅的編寫crud操作呢?帶著這個問題,我們發(fā)現(xiàn)項目中大量的操作多是 創(chuàng)建實體 、刪除實例、 修改實體、 查詢單個實體、 分頁查詢多個實體...
摘要:除了,還有十余種,有的是特定操作,比如轉(zhuǎn)儲內(nèi)存日志有的是信息展示,比如顯示應(yīng)用健康狀態(tài)。 showImg(http://ww1.sinaimg.cn/large/006tNc79gy1g5qb2coyfoj30u00k0tan.jpg); 前言 隨著線上應(yīng)用逐步采用 SpringBoot 構(gòu)建,SpringBoot應(yīng)用實例越來多,當線上某個應(yīng)用需要升級部署時,常常簡單粗暴地使用 kil...
摘要:開發(fā)你的第一個應(yīng)用程序本節(jié)描述如何開發(fā)一個簡單的應(yīng)用程序來突出了的一些關(guān)鍵特性,我們使用來構(gòu)建這個項目,因為大多數(shù)都支持它。如果你希望分發(fā)一個自包含的應(yīng)用程序,這可能會有問題。 11. 開發(fā)你的第一個Spring Boot應(yīng)用程序 本節(jié)描述如何開發(fā)一個簡單的Hello World! web應(yīng)用程序來突出了Spring Boot的一些關(guān)鍵特性,我們使用Maven來構(gòu)建這個項目,因為大多數(shù)...
摘要:在項目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個模塊中的屬性變得容易。 在編寫項目代碼時,我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...
摘要:在項目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個模塊中的屬性變得容易。 在編寫項目代碼時,我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...
閱讀 3063·2021-10-12 10:20
閱讀 2808·2021-09-27 13:56
閱讀 790·2021-09-27 13:36
閱讀 1423·2021-09-26 09:46
閱讀 2417·2019-08-30 14:02
閱讀 2684·2019-08-28 18:14
閱讀 1257·2019-08-26 10:32
閱讀 1699·2019-08-23 18:25