摘要:導(dǎo)讀在團(tuán)隊(duì)協(xié)作的時(shí)候許多時(shí)候需要用到接口文檔,我們通常通過(guò)手工編寫(xiě)大量重復(fù)格式的文檔,讓我想起了程序員最討厭的兩件事沒(méi)有文檔,編寫(xiě)文檔。對(duì)應(yīng)的資料可自行谷歌。關(guān)于和官網(wǎng)是這樣描述的。我們可以理解為為基于構(gòu)建的自動(dòng)生成文檔。
導(dǎo)讀:
在團(tuán)隊(duì)協(xié)作的時(shí)候許多時(shí)候需要用到接口文檔,我們通常通過(guò)手工編寫(xiě)大量重復(fù)格式的文檔,讓我想起了程序員最討厭的兩件事:沒(méi)有文檔,編寫(xiě)文檔。哈哈,如果使用過(guò)swagger的朋友應(yīng)該都很了解它帶給我們的便利,如果你還沒(méi)有使用swagger的話,正好打算編寫(xiě)RESTful API文檔,這里有一篇文章Spring Boot中使用Swagger2構(gòu)建強(qiáng)大的RESTful API文檔可以幫助你在較短的時(shí)間內(nèi)構(gòu)建出一個(gè)線上文檔,有些時(shí)候我們需要生成離線文檔有該怎么做呢?帶著這個(gè)問(wèn)題我們一起去出發(fā)。
關(guān)于swagger:Swagger - 前后端分離后的契約
通過(guò)Swagger進(jìn)行API設(shè)計(jì),與Tony Tam的一次對(duì)話
一個(gè)簡(jiǎn)短的總結(jié),更好的生成RESTful API文檔,提供相應(yīng)的測(cè)試功能,效果圖如下:
編寫(xiě)離線文檔:swagger為我們提供了生成在線文檔的功能,然而有些時(shí)候客戶(hù)需要的是離線文檔的api,有沒(méi)有什么較好的辦法可以通過(guò)swagger幫助我們生成離線文檔呢?
這就是今天的主角:Springfox和Spring Rest Docs幫我們做的事情
1.預(yù)備知識(shí):
建議了解swagger、Asciidoc、asciidoctor-maven-plugin和SpringBoot Testing。對(duì)應(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自動(dòng)生成文檔。
其實(shí)我們的思路就是把swagger在線文檔轉(zhuǎn)成staticdocs形式的文檔,引入相關(guān)的一些依賴(lài) Spring Rest Docs的依賴(lài)spring-restdocs-mockmvc,離線文檔的依賴(lài)springfox-staticdocs,因?yàn)橐趩卧獪y(cè)試的時(shí)候生成文檔,所以再加測(cè)試相關(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格式
了解更多: 使用介紹
編寫(xiě)測(cè)試類(lèi)生成離線文檔: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,寫(xiě)入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,寫(xiě)入到outputDir // 這個(gè)outputDir必須和插件里面標(biāo)簽配置一致 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("查詢(xún)用戶(hù)", preprocessResponse(prettyPrint()))); UserInfo userInfo = new UserInfo(); userInfo.setName("lisi"); userInfo.setAge(23); userInfo.setAddress("山東濟(jì)南"); 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("新增用戶(hù)", preprocessResponse(prettyPrint()))); } }
由于前面已經(jīng)配置了maven的插件,只需要執(zhí)行測(cè)試就可以生成相應(yīng)的文檔, 效果圖如下:
補(bǔ)充: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項(xiàng)目生成RESTfull API的文檔
Introduction to Spring REST Docs
asciidoctor-maven-plugin
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70000.html
摘要:以下內(nèi)容基于如果你使用的也是相同的技術(shù)棧可以繼續(xù)往下閱讀,如果不是可以當(dāng)作參考。編寫(xiě)的四種方式裸寫(xiě)最簡(jiǎn)單最粗暴也是使用最多的一種方式,在寫(xiě)的多了之后可以用生成工具生成。 導(dǎo)讀 在目前接觸過(guò)的項(xiàng)目中大多數(shù)的項(xiàng)目都會(huì)涉及到: crud相關(guān)的操作, 哪如何優(yōu)雅的編寫(xiě)crud操作呢?帶著這個(gè)問(wèn)題,我們發(fā)現(xiàn)項(xiàng)目中大量的操作多是 創(chuàng)建實(shí)體 、刪除實(shí)例、 修改實(shí)體、 查詢(xún)單個(gè)實(shí)體、 分頁(yè)查詢(xún)多個(gè)實(shí)體...
摘要:除了,還有十余種,有的是特定操作,比如轉(zhuǎn)儲(chǔ)內(nèi)存日志有的是信息展示,比如顯示應(yīng)用健康狀態(tài)。 showImg(http://ww1.sinaimg.cn/large/006tNc79gy1g5qb2coyfoj30u00k0tan.jpg); 前言 隨著線上應(yīng)用逐步采用 SpringBoot 構(gòu)建,SpringBoot應(yīng)用實(shí)例越來(lái)多,當(dāng)線上某個(gè)應(yīng)用需要升級(jí)部署時(shí),常常簡(jiǎn)單粗暴地使用 kil...
摘要:開(kāi)發(fā)你的第一個(gè)應(yīng)用程序本節(jié)描述如何開(kāi)發(fā)一個(gè)簡(jiǎn)單的應(yīng)用程序來(lái)突出了的一些關(guān)鍵特性,我們使用來(lái)構(gòu)建這個(gè)項(xiàng)目,因?yàn)榇蠖鄶?shù)都支持它。如果你希望分發(fā)一個(gè)自包含的應(yīng)用程序,這可能會(huì)有問(wèn)題。 11. 開(kāi)發(fā)你的第一個(gè)Spring Boot應(yīng)用程序 本節(jié)描述如何開(kāi)發(fā)一個(gè)簡(jiǎn)單的Hello World! web應(yīng)用程序來(lái)突出了Spring Boot的一些關(guān)鍵特性,我們使用Maven來(lái)構(gòu)建這個(gè)項(xiàng)目,因?yàn)榇蠖鄶?shù)...
摘要:在項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過(guò)注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個(gè)發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個(gè)模塊中的屬性變得容易。 在編寫(xiě)項(xiàng)目代碼時(shí),我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...
摘要:在項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過(guò)注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個(gè)發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個(gè)模塊中的屬性變得容易。 在編寫(xiě)項(xiàng)目代碼時(shí),我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...
閱讀 3091·2021-10-12 10:20
閱讀 2824·2021-09-27 13:56
閱讀 799·2021-09-27 13:36
閱讀 1439·2021-09-26 09:46
閱讀 2425·2019-08-30 14:02
閱讀 2693·2019-08-28 18:14
閱讀 1270·2019-08-26 10:32
閱讀 1712·2019-08-23 18:25