国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Boot [如何優(yōu)雅的編寫文檔]

曹金海 / 1226人閱讀

摘要:導讀在團隊協(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自動生成文檔。

引入pom依賴:

其實我們的思路就是把swagger在線文檔轉(zhuǎn)成staticdocs形式的文檔,引入相關(guān)的一些依賴 Spring Rest Docs的依賴spring-restdocs-mockmvc,離線文檔的依賴springfox-staticdocs,因為要在單元測試的時候生成文檔,所以再加測試相關(guān)的spring-boot-starter-test。


    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
使用Maven插件:

我們使用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

相關(guān)文章

  • Spring Boot 中 crud如何優(yōu)雅實現(xiàn)-附代碼

    摘要:以下內(nèi)容基于如果你使用的也是相同的技術(shù)棧可以繼續(xù)往下閱讀,如果不是可以當作參考。編寫的四種方式裸寫最簡單最粗暴也是使用最多的一種方式,在寫的多了之后可以用生成工具生成。 導讀 在目前接觸過的項目中大多數(shù)的項目都會涉及到: crud相關(guān)的操作, 哪如何優(yōu)雅的編寫crud操作呢?帶著這個問題,我們發(fā)現(xiàn)項目中大量的操作多是 創(chuàng)建實體 、刪除實例、 修改實體、 查詢單個實體、 分頁查詢多個實體...

    wing324 評論0 收藏0
  • 如何優(yōu)雅關(guān)閉 Spring Boot 應(yī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...

    xiyang 評論0 收藏0
  • Spring Boot 參考指南(開發(fā)你第一個Spring Boot應(yīng)用程序)

    摘要:開發(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ù)...

    Cristalven 評論0 收藏0
  • @ConfigurationProperties 注解使用姿勢,這一篇就夠了

    摘要:在項目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個模塊中的屬性變得容易。 在編寫項目代碼時,我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...

    SolomonXie 評論0 收藏0
  • @ConfigurationProperties 注解使用姿勢,這一篇就夠了

    摘要:在項目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個模塊中的屬性變得容易。 在編寫項目代碼時,我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...

    KoreyLee 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<