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

資訊專欄INFORMATION COLUMN

Spring Boot集成Swagger2

liukai90 / 1229人閱讀

摘要:前言目前互聯(lián)網(wǎng)開發(fā)市場(chǎng)都流行前后臺(tái)真正的分離,后臺(tái)提供數(shù)據(jù)接口,前臺(tái)負(fù)責(zé)請(qǐng)求數(shù)據(jù)并渲染。今天就介紹一款將接口文檔編寫和測(cè)試合并一起的集大成者,也是目前很多企業(yè)再用的一個(gè)管理工具。

前言:目前互聯(lián)網(wǎng)開發(fā)市場(chǎng)都流行前后臺(tái)真正的分離,后臺(tái)提供數(shù)據(jù)API接口,前臺(tái)負(fù)責(zé)請(qǐng)求數(shù)據(jù)并渲染。那么我們程序猿們?cè)诰帉懡涌诘臅r(shí)候,最不方便之處就是寫完接口后需要進(jìn)行文檔的編寫以及接口的測(cè)試。今天就介紹一款將接口文檔編寫和測(cè)試合并一起的集大成者Swagger,也是目前很多企業(yè)再用的一個(gè)API管理工具。此DEMO的開發(fā)環(huán)境是:MAVEN + Spring Boot 2.1.0 + JDK8 + Swagger2.9.2

1、快速構(gòu)建Spring Boot項(xiàng)目

在https://start.spring.io/中選...,然后選用Spring Boot2.1.0版本,Group是com.mage,Artifact是swagger_restful,Dependencies選擇web,這樣就能快速構(gòu)建一個(gè)基于Spring Boot的web項(xiàng)目了。如下圖:

2、使用IDEA打開項(xiàng)目

解壓swagger_restful.zip,然后使用idea導(dǎo)入項(xiàng)目,并執(zhí)行SwaggerRestfulApplication.java,不報(bào)錯(cuò)說(shuō)明項(xiàng)目構(gòu)建成功

3、pom導(dǎo)入swagger2的依賴jar包


    io.springfox
    springfox-swagger2
    2.9.2




    io.springfox
    springfox-swagger-ui
    2.9.2

其中springfox-swagger2這個(gè)jar包是用于JSON API文檔的生成,springfox-swagger-ui用于API文檔界面生成,其他版本請(qǐng)參考:https://mvnrepository.com/art...://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui

5、編寫測(cè)試的Controller和Model(TestController和Test)

編寫一個(gè)Test的數(shù)據(jù)模型

package com.mage.swagger_restful.model;

public class Test {
    private Integer id;
    private String content;
    private Integer isValid;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Integer getIsValid() {
        return isValid;
    }

    public void setIsValid(Integer isValid) {
        this.isValid = isValid;
    }
}

基于Restful規(guī)則,編寫一組測(cè)試的API接口:

package com.mage.swagger_restful.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("test")
public class TestController {

    @GetMapping("")
    public String list() {
        return "查詢列表數(shù)據(jù)!";
    }

    @GetMapping("{id}")
    public String find(@PathVariable Integer id) {
        return String.format("根據(jù)主鍵查詢數(shù)據(jù): %d", id);
    }

    @PostMapping("")
    public String add() {
        return "插入數(shù)據(jù)!";
    }

    @PutMapping("{id}")
    public String update(@PathVariable Integer id) {
        return String.format("根據(jù)主鍵更新一條記錄: %d", id);
    }

    @DeleteMapping("{id}")
    public String delete(@PathVariable Integer id) {
        return String.format("根據(jù)主鍵刪除記錄: %d", id);
    }
}

因?yàn)榻涌谑腔赗estful(本文不討論Restful的編寫規(guī)范)編寫,所以如果單純利用瀏覽器輸入是沒法進(jìn)行接口測(cè)試的,比如模擬post, put或者delete請(qǐng)求,這時(shí)要測(cè)試可以借助一些瀏覽器的插件比如postman或者rested等。這樣我們還要額外去安裝工具,顯得比較麻煩,同時(shí)工作中寫完接口后,一般還會(huì)編寫接口文檔,那么聰明的碼農(nóng)就想著能不能優(yōu)化這個(gè)流程,讓接口測(cè)試和接口文檔編寫變得簡(jiǎn)單快捷,于是乎,swagger應(yīng)用而生。

6、代碼中集成Swagger a) 編寫Swagger的配置類
package com.mage.swagger_restful.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
@ConditionalOnExpression("${swagger.enable:true}")
public class SwaggerConfig {

    @Bean
    public Docket createDocket(){

        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder().title("碼歌學(xué)院API")
                        .description("碼歌學(xué)院相關(guān)接口API文檔")
                        .version("1.0").build())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.mage"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

}

其中@EnableSwagger2開啟Swagger2功能,是swagger2的注解,@ConditionalOnExpression("${swagger.enable:true}")當(dāng)配置文件中swagger.enable為true時(shí)才啟用swagger2,是spring boot注解,方便區(qū)分不同環(huán)境下是否啟用swagger2。

b) 修改application.properties
swagger.enable=true
c) 修改Test實(shí)體模型和TestController,添加Swagger對(duì)應(yīng)注解

修改Test實(shí)體模型:

package com.mage.swagger_restful.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel(description = "測(cè)試模型實(shí)體")
public class Test {
    @ApiModelProperty(name = "id", value = "主鍵", hidden = true)
    private Integer id;
    @ApiModelProperty(name = "content", value = "測(cè)試內(nèi)容")
    private String content;
    @ApiModelProperty(name = "isValid", value = "是否有效0=無(wú)效,1=有效", hidden = true)
    private Integer isValid;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Integer getIsValid() {
        return isValid;
    }

    public void setIsValid(Integer isValid) {
        this.isValid = isValid;
    }
}

其中:

@ApiModel(description = "測(cè)試模型實(shí)體")作用在參數(shù)實(shí)體或者響應(yīng)實(shí)體上,description代表描述信息;

@ApiModelProperty(name = "id", value = "主鍵", hidden = true)作用在實(shí)體屬性上,標(biāo)記屬性名稱和說(shuō)明內(nèi)容,name代表屬性名稱,value表示屬性內(nèi)容,hidden是否因此,默認(rèn)是false。

修改TestController:

package com.mage.swagger_restful.controller;

import com.mage.swagger_restful.model.Test;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("test")
@Api(tags = "測(cè)試API接口")
public class TestController {

    @GetMapping("")
    @ApiOperation(value="獲取列表數(shù)據(jù)", notes="獲取列表下測(cè)試數(shù)據(jù)")
    public String list() {
        return "查詢列表數(shù)據(jù)!";
    }

    @GetMapping("{id}")
    @ApiOperation(value="獲取ID數(shù)據(jù)", notes="根據(jù)ID獲取某條測(cè)試數(shù)據(jù)")
    @ApiImplicitParam(name = "id", value = "主鍵id", paramType = "path", required = true)
    public String find(@PathVariable Integer id) {
        return String.format("根據(jù)主鍵查詢數(shù)據(jù): %d", id);
    }

    @PostMapping("")
    @ApiOperation(value="新增數(shù)據(jù)")
    @ApiParam(name = "test", value = "添加的測(cè)試模型實(shí)體")
    public String add(@RequestBody Test test) {
        return "插入數(shù)據(jù)!";
    }

    @PutMapping("{id}")
    @ApiOperation(value="更新數(shù)據(jù)", notes="根據(jù)ID更新測(cè)試數(shù)據(jù)")
    @ApiImplicitParam(name = "id", value = "主鍵id", paramType = "path", required = true)
    public String update(@PathVariable Integer id, @ApiParam(name = "test", value = "更新的測(cè)試模型實(shí)體") @RequestBody Test test) {
        return String.format("根據(jù)主鍵更新一條記錄: %d", id);
    }

    @DeleteMapping("{id}")
    @ApiOperation(value="刪除數(shù)據(jù)", notes="根據(jù)ID刪除測(cè)試數(shù)據(jù)")
    @ApiImplicitParam(name = "id", value = "主鍵id", paramType = "path", required = true)
    public String delete(@PathVariable Integer id) {
        return String.format("根據(jù)主鍵刪除記錄: %d", id);
    }
}

其中:

@Api(tags = "測(cè)試API接口")標(biāo)記controller類是做什么的,tags表示分類;

@ApiOperation(value="獲取列表數(shù)據(jù)", notes="獲取列表下測(cè)試數(shù)據(jù)")標(biāo)記controller下的方法,表示這個(gè)接口是做什么的,value就是說(shuō)明作用,notes詳細(xì)說(shuō)明;

@ApiImplicitParam(name = "id", value = "主鍵id", paramType = "path", required = true)標(biāo)記參數(shù),name是參數(shù)名,value是參數(shù)說(shuō)明,paramType是參數(shù)類型:path(路徑參數(shù)),query(查詢參數(shù)), body(請(qǐng)求體參數(shù)),header(請(qǐng)求頭參數(shù)),form(表單提交參數(shù)),require代表是否必填,默認(rèn)是false

@ApiParam(name = "test", value = "更新的測(cè)試模型實(shí)體")跟@ApiImplicitParam類似,標(biāo)記參數(shù),不過不同的是:

對(duì)Servlets或者非 JAX-RS的環(huán)境,只能使用 ApiImplicitParam。

在使用上,ApiImplicitParam比ApiParam具有更少的代碼侵入性,只要寫在方法上就可以了,但是需要提供具體的屬性才能配合swagger ui解析使用。

ApiParam只需要較少的屬性,與swagger ui配合更好。

7、瀏覽器輸入地址:http://localhost:8080/swagger-ui.html

點(diǎn)開測(cè)試API接口就可以進(jìn)行測(cè)試:

8、注意

如果采用swagger2.9.0時(shí),會(huì)出現(xiàn)一個(gè)bug,比如我修改一下TestController里面的find方法

舊方法:

新方法:

這時(shí)如果啟動(dòng),訪問swagger ui時(shí)會(huì)出現(xiàn)一個(gè)bug:

這個(gè)是一個(gè)數(shù)據(jù)類型轉(zhuǎn)化的錯(cuò)誤,就是因?yàn)槲以O(shè)置了id為int類型,而swagger默認(rèn)給的是空字符串,因此就提示錯(cuò)誤,解決方案有兩種,第一種就是不要寫dataType,第二種就是升級(jí)swagger-annotations和models jar包:

a)排除已經(jīng)依賴的swagger-annotations和models jar包


    io.springfox
    springfox-swagger2
    2.9.2
    
        
            io.swagger
            swagger-annotations
        
        
            io.swagger
            swagger-models
        
    

b) 引入新的jar包


    io.swagger
    swagger-annotations
    1.5.21


    io.swagger
    swagger-models
    1.5.21

這樣也能完美解決!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72451.html

相關(guān)文章

  • Java | Spring Boot Swagger2 集成REST ful API 生成接口文檔

    摘要:集成生成接口文檔原文簡(jiǎn)介由于的特性,用來(lái)開發(fā)變得非常容易,并且結(jié)合來(lái)自動(dòng)生成文檔變得方便快捷。使用生成,我們可以得到交互式文檔。聽過與的結(jié)合,生成更加完備的文檔。接下來(lái)將基于與搭建完整的文檔系統(tǒng)。 Spring Boot Swagger2 集成REST ful API 生成接口文檔 原文 簡(jiǎn)介 由于Spring Boot 的特性,用來(lái)開發(fā) REST ful 變得非常容易,并且結(jié)合 Sw...

    joyvw 評(píng)論0 收藏0
  • SpringBoot 實(shí)戰(zhàn) (五) | 集成 Swagger2 構(gòu)建強(qiáng)大的 RESTful API

    摘要:今天給你們帶來(lái)集成的教程。接口返回結(jié)果不明確。這些痛點(diǎn)在前后端分離的大型項(xiàng)目上顯得尤為煩躁。接口返回結(jié)果非常明確,包括數(shù)據(jù)類型,狀態(tài)碼,錯(cuò)誤信息等。生成后的文件依賴如下這里使用的是的版本。另外,關(guān)注之后在發(fā)送可領(lǐng)取免費(fèi)學(xué)習(xí)資料。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人如有問題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問題。 前言 快過年了,不知道你們啥時(shí)候放年假,忙不忙。反正我是挺閑的,所以有時(shí)間寫 b...

    Rindia 評(píng)論0 收藏0
  • 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》

    摘要:下一代服務(wù)端開發(fā)下一代服務(wù)端開發(fā)第部門快速開始第章快速開始環(huán)境準(zhǔn)備,,快速上手實(shí)現(xiàn)一個(gè)第章企業(yè)級(jí)服務(wù)開發(fā)從到語(yǔ)言的缺點(diǎn)發(fā)展歷程的缺點(diǎn)為什么是產(chǎn)生的背景解決了哪些問題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級(jí)服務(wù)開發(fā)在移動(dòng)開發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》 Kotlin + Spring Boot : 下一代 Java...

    springDevBird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<