相信無論是前端還是後端開發,都或多或少地被接口文檔折磨過。前端經常抱怨後端給的接口文檔與實際情況不一致。後端又覺得編寫及維護接口文檔會耗費不少精力,經常來不及更新。其實無論是前端調用後端,還是後端調用後端,都期望有一個好的接口文檔。
SpringBoot集成Swagger能夠通過很簡單的註解把接口描述清楚,生成可視化文檔頁面。
原生的Swagger-ui界面很粗糙,這裏用knife4j-spring-ui替代。
一個好的HTTP接口文檔描述
- 寫清楚接口的請求路徑: QueryPath: /user/login
- 寫清楚接口的請求方法類型: GET/POST/DELETE/PUT
- 寫清楚接口的業務含義,使用場景
- 寫清楚接口的入參:參數描述、參數類型、參數結構、參數是否必傳
- 寫清楚接口的返回類型:返回的數據結構,異常狀況
SpringBoot集成Swagger
項目引入依賴
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>2.0.4</version>
</dependency>
SpringBoot關於Swagger配置
把此Swagger配置粘入項目即可
@EnableSwagger2
@Configuration
public class SwaggerConfig implements WebMvcConfigurer {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//這裏改成自己的接口包名
.apis(RequestHandlerSelectors.basePackage("vip.codehome.springboot.tutorials.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SpringBoot教程接口文檔")//標題
.description("使用swagger文檔管理接口")//描述
.contact(new Contact("codehome", "", "dsyslove@163.com"))//作者信息
.version("1.0.0")//版本號
.build();
}
//解決doc.html,swagger-ui.html 404問題
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
}
}
Swagger的具體使用
各個註解的作用
- @Api 放在類上介紹類的作用
- @ApiOperation 放在方法上介紹方法的作用
- @ApiImplicitParam介紹入參説明
- @ApiResponse介紹返回狀態
- @ApiModel、@ApiModelProperty介紹入參是對象,返回是對象字段説明
代碼示例
@RestController
@Api(tags = "Swagger註解測試類")
public class SwaggerUserController {
@ApiOperation(value = "這是一個echo接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "msg",value = "請求的msg參數",required = true,paramType = "query"),
@ApiImplicitParam(name = "token",value = "請求的token",required = false,paramType ="header" )
})
@ApiResponses({
@ApiResponse(code=200,message = "請求成功"),
@ApiResponse(code=400,message="請求無權限")
})
@GetMapping("/echo")
public String echo(String msg,@RequestHeader(name = "token") String token){
return msg;
}
@PostMapping("/login")
public R<UserInfoVO> login(@RequestBody LoginDTO loginDTO){
UserInfoVO userInfoVO=new UserInfoVO();
userInfoVO.setNickname("編程之家");
userInfoVO.setToken("xxx");
return R.ok(userInfoVO);
}
}
@Data
@ApiModel
public class LoginDTO {
@ApiModelProperty(value = "用户賬號或者郵箱")
String account;
@ApiModelProperty(value = "用户密碼")
String passwd;
@ApiModelProperty(value = "用户密碼")
String verifyCode;
}
接口文檔效果
這裏訪問的是http://localhost:8080/doc.html,knife4j-spring-ui還有相比原生還有更多強大的功能,大家自行發現。