1. 程式人生 > >微服務架構實戰篇(二):Spring boot2.0 + Swagger2 讓你的API視覺化

微服務架構實戰篇(二):Spring boot2.0 + Swagger2 讓你的API視覺化

簡介

該專案主要利用Spring boot2.0 +Swagger2 方便進行測試後臺的restful形式的介面,實現動態的更新,當我們在後臺的介面修改了後,swagger可以實現自動的更新,而不需要認為的維護這個介面進行測試。

小工具一枚,歡迎使用和Star支援,如使用過程中碰到問題,可以提出Issue,我會盡力完善該Starter

版本基礎

  • Spring Boot:2.0.4
  • Swagger2:2.7.0

 

操作步驟

第一步:下載SpringBoot2.0專案

第二步:新增maven依賴

        <dependency>

            <groupId>io.springfox</groupId>

            <artifactId>springfox-swagger2</artifactId>

            <version>2.7.0</version>

        </dependency>

        <dependency>

            <groupId>io.springfox</groupId>

            <artifactId>springfox-swagger-ui</artifactId>

            <version>2.7.0</version>

        </dependency>

        <dependency>

            <groupId>org.apache.tomcat.embed</groupId>

            <artifactId>tomcat-embed-jasper</artifactId>

        </dependency>

        <!-- 打war包用 -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-tomcat</artifactId>

            <scope>provided</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

第三步:application.properties 增加swagger配置

#開啟swagger服務

swagger.enable=true

第四步:使用註解配置Swagger

@Configuration

@EnableSwagger2

public class Swagger2Config {

    public static final String BASE_PACKAGE = "com.itunion";

    @Value("${swagger.enable}")

    private boolean enableSwagger;

    @Bean

    public Docket createRestApi() {

        return new Docket(DocumentationType.SWAGGER_2)

                .apiInfo(apiInfo())                // 生產環境的時候關閉 swagger 比較安全

                .enable(enableSwagger)                //將Timestamp型別全部轉為Long型別

                .directModelSubstitute(Timestamp.class, Long.class)                //將Date型別全部轉為Long型別

                .directModelSubstitute(Date.class, Long.class)

                .select()                // 掃描介面的包路徑,不要忘記改成自己的

                .apis(RequestHandlerSelectors.basePackage(BASE_PACKAGE))

                .paths(PathSelectors.any())

                .build();

    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder()

            .title("Swagger RESTful APIs")

            .description("Swagger API 服務")

            .termsOfServiceUrl("http://swagger.io/")

            .contact(new Contact("Swagger", "127.0.0.1", "[email protected]"))

            .version("1.0")

            .build();

    }

 

}

 

備註

  • 正常專案上線後應該是關閉掉 swagger 的,所以這邊增加了一個配置 enableSwagger
  • 可以使用 directModelSubstitute 做一些期望的型別轉換

第五步:建立使用者實體類UserInfo

public class UserInfo {

    @ApiModelProperty("編號")

    private Long id;

    @ApiModelProperty("使用者名稱")

    private String userName;

    @ApiModelProperty("姓")

    private String firstName;

    @ApiModelProperty("名")

    private String lastName;

    @ApiModelProperty("郵箱")

    private String email;

    @ApiModelProperty(hidden = true)// 密碼不傳輸

    @JsonIgnore

    private String password;

    @ApiModelProperty("狀態")

    private Integer userStatus;

   /**此處省略get、set **/

 }

第六步:編寫一個首頁的Controller

@Api(value = "首頁", description = "首頁")

@RequestMapping("/")

@RestController

public class IndexController {

    @ApiOperation(value = "Hello Spring Boot", notes = "Hello Spring Boot")

    @RequestMapping(value = "/", method = RequestMethod.GET)

    public String index() {

        return "Hello Spring Boot";

    }

    @ApiOperation(value = "API 頁面", notes = "介面列表")

    @RequestMapping(value = "/api", method = RequestMethod.GET)

    public void api(HttpServletResponse response) throws IOException {

        response.sendRedirect("swagger-ui.html");

    }

}

  • 為了方便訪問swagger ui 頁面,我們做了一個重定向 api 更方便些

第七步:編寫一個登陸的Controller

@Api(value = "使用者", description = "使用者")

@RequestMapping("/userInfo")

@RestController

public class UserInfoController {

    @ApiOperation(value = "登入介面-多值傳值方式", notes = "輸入使用者名稱和密碼登入")

    @ApiResponses(value = {

            @ApiResponse(code = 200, message = "OK", response = UserInfo.class, responseContainer = "userInfo"),

            @ApiResponse(code = 405, message = "賬號名或密碼錯誤")

    })

    @ApiImplicitParam(name = "map", value = "{\"userName\":\"JackMa\",\"passWord\":\"123\"}")

    @RequestMapping(value = "loginForMap", method = RequestMethod.POST, produces= MediaType.APPLICATION_JSON_UTF8_VALUE)

    ResponseEntity<UserInfo> loginForMap(@RequestBody Map<String, String> map) {

        if (!map.get("userName").equalsIgnoreCase("JackMa") || !map.get("passWord").equalsIgnoreCase("123")) {

            return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build();

        }

        UserInfo user = new UserInfo();

        user.setId(1L);

        user.setUserName("JackMa");

        user.setFirstName("馬");

        user.setLastName("雲");

        user.setEmail("[email protected]");

        user.setUserStatus(1);

        return ResponseEntity.ok(user);

    }

 

    @ApiOperation(value = "登入介面-多值傳輸方式", notes = "輸入使用者名稱和密碼登入")

    @ApiResponses(value = {

            @ApiResponse(code = 200, message = "OK", response = UserInfo.class, responseContainer = "userInfo"),

            @ApiResponse(code = 405, message = "賬號名或密碼錯誤")

    })

    @ApiImplicitParams({

            @ApiImplicitParam(name = "userName",value = "使用者名稱", required = true, dataType = "string", paramType = "query"),

            @ApiImplicitParam(name = "passWord",value = "密碼", required = true, dataType = "string",paramType = "query"),

    })

    @RequestMapping(value = "loginForParams", method = RequestMethod.POST, produces= MediaType.APPLICATION_JSON_UTF8_VALUE)

    ResponseEntity<UserInfo> loginForMap(@RequestParam String userName, @RequestParam String passWord) {

        if (!userName.equalsIgnoreCase("JackMa") || !passWord.equalsIgnoreCase("123")) {

            return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build();

        }

        UserInfo user = new UserInfo();

        user.setId(1L);

        user.setUserName("JackMa");

        user.setFirstName("馬");

        user.setLastName("雲");

        user.setEmail("[email protected]");

        user.setUserStatus(1);

        return ResponseEntity.ok(user);

    }

 

}

 

備註

  • 使用Params和Param 實現了兩種不同的資料傳輸方式
  • 建議使用Spring的 ResponseEntity 類做統一的返回結果
  • swagger 對 response code 的支援還算好,我們可以把可能出現的異常程式碼都一一羅列出來,方便對接的時候對異常的處理

第八步:啟動執行

http://127.0.0.1:8081/api

備註

  • 埠號已自己配置為準

如下圖所示:

swagger2.jpg

第九步:執行

輸入.jpg

輸出.jpg

貢獻者

更多精彩內容可以關注“IT實戰聯盟”微信*公*眾*號哦~~~