本次和大家分享的是java方面的springmvc來構建的webapi介面+swagger文件;上篇文章分享.net的webapi用swagger來構建文件,因為有朋友問了為啥.net有docpage文件你還用swagger,這裡主要目的是讓介面文件統一,當操作多種開發語言做介面時,如果有統一風格的api文件是不是很不錯;還有就springcloude而言,微服務如果有很多的話,使用swagger自動根據服務serverid來載入api文件是很方便的。swagger設定比較簡單,為了今後查詢資料和使用方便故此記錄下
- 準備工作
- 快速構建api文件
- 常用的細節
- 過濾預設錯誤api
- 新增授權token列
- 新增上傳檔案列
準備工作
首選需要一個springmvc專案,這裡我用的是springboot+maven來快速構建, 要使用swagger只需要在maven中新增依賴包就行:
1 <dependency> 2 <groupId>io.springfox</groupId> 3 <artifactId>springfox-swagger2</artifactId> 4 <version>2.6.1</version> 5 </dependency> 6 <dependency> 7 <groupId>io.springfox</groupId> 8 <artifactId>springfox-swagger-ui</artifactId> 9 <version>2.6.1</version> 10 </dependency>
然後建立一個UserController,然後再定義個Login的Action,定義請求和響應實體,由於api介面需要對請求和響應屬性列做 文字描述,並且上面我們在專案中加了swagger包,因此以直接在實體和Action使用特性來增加具體文字描述:
1 @RestController 2 @Api(tags = "會員介面") 3 public class UserController { 4 5 @PostMapping("/login") 6 @ApiOperation(value = "登入") 7 public LoginRp login(@RequestBody LoginRq rq) { 8 LoginRp rp = new LoginRp(); 9 10 if (rq.getUserName().isEmpty() || rq.getUserPwd().isEmpty()) { 11 rp.setCode(EmApiCode.登入賬號或密碼不能為空.getVal()); 12 return rp; 13 } 14 15 if (rq.getUserName().equals("shenniu001") && rq.getUserPwd().equals("123")) { 16 rp.setCode(EmApiCode.成功.getVal()); 17 18 rp.setToken(UUID.randomUUID().toString()); 19 } else { 20 rp.setCode(EmApiCode.失敗.getVal()); 21 } 22 return rp; 23 } 24 25 }
請求和響應實體類:
1 @ApiModel 2 public class LoginRq implements Serializable{ 3 4 private static final long serialVersionUID = -158328750073317876L; 5 6 @ApiModelProperty(value = "登入賬號") 7 private String userName; 8 9 @ApiModelProperty(value = "登入密碼") 10 private String userPwd; 11 12 } 13 14 @ApiModel 15 public class LoginRp extends BaseRp implements Serializable { 16 private static final long serialVersionUID = -1486838360296425228L; 17 18 @ApiModelProperty(value = "授權token") 19 private String token; 20 21 public String getToken() { 22 return token; 23 } 24 25 public void setToken(String token) { 26 this.token = token; 27 } 28 }
註解簡單說明:
@Api:同一類介面的總描述,一般用於Controller標記
@ApiOperation(value = "登入"):在Action上標記,描述這個Action介面具體幹什麼
@ApiModel:請求響應實體類class上的標記
@ApiModelProperty(value = "登入賬號"):請求響應屬性上的標記,用來描述該屬性具體說明
快速構建api文件
準備做完後要生成文件,還需要自定義兩個封裝類,如下Swagger2類:
1 @Configuration 2 @EnableSwagger2 3 public class Swagger2 { 4 5 @Bean 6 public Docket createRestApi() { 7 8 return new Docket(DocumentationType.SWAGGER_2) 9 .select() 10 //過濾預設錯誤api 11 .paths(Predicates.not(PathSelectors.regex("/error.*"))) 12 .build() 13 .apiInfo(apiInfo()); 14 } 15 16 //常用的細節 17 //過濾指定的action 18 //新增授權token列 19 //新增上傳檔案列 20 private ApiInfo apiInfo() { 21 return new ApiInfoBuilder() 22 .title("開車介面文件") 23 .description("該文件只允許我使用") 24 //版本 25 .version("0.0.0.1") 26 .contact("作者:841202396@qq.com") 27 .build(); 28 } 29 }
這個類主要初始化一些全域性文件的說明和版本並且構架api文件;上面是生成文件,但是具體文件資料來源用從swagger的SwaggerResourcesProvider中來,因此自定義的DocumentationConfig類實現SwaggerResourcesProvider介面,如下:
1 @Component 2 @Primary 3 public class DocumentationConfig implements SwaggerResourcesProvider { 4 @Override 5 public List<SwaggerResource> get() { 6 List resources = new ArrayList<>(); 7 resources.add(swaggerResource("開車介面api", "/v2/api-docs", "0.0.0.1")); 8 resources.add(swaggerResource("坐車介面api", "/v2/api-docs", "0.0.0.1")); 9 return resources; 10 } 11 12 private SwaggerResource swaggerResource(String name, String location, String version) { 13 SwaggerResource swaggerResource = new SwaggerResource(); 14 swaggerResource.setName(name); 15 swaggerResource.setLocation(location); 16 swaggerResource.setSwaggerVersion(version); 17 return swaggerResource; 18 } 19 }
主要載入文件的資料來源,資料來源主要通過 resources.add(swaggerResource("坐車介面api", "/v2/api-docs", "0.0.0.1")) 新增,倘若你想新增其他api介面源就可以在這裡進行配置,直接把/v2/api-docs改成你的url就行,這個地方也是springcloud微服務api新增的入口;當編碼完成後我們來看看效果:
能成功載入出我們的login介面,而且有一些說明性的文字;再來看看我們請求和響應的引數是否有說明:
請求和響應都有了相應的說明,是不是挺簡單;
常用的細節
1.過濾預設錯誤api
由於springmvc封裝有錯誤的controller,因此swagger也會把這個展示出來,因為是掃描的所有controller來展示swagger文件的,故此我們需要遮蔽這些對於對接方沒用的介面;這裡通過設定paths的不匹配就行了,以下程式碼:
1 //過濾預設錯誤api 2 paths(Predicates.not(PathSelectors.regex("/error.*")))
2.新增授權token列
對於介面驗證來說通常需要個token並且放在header裡面,這裡我們直接在swagger上增加一個顯示的token,只需要在build之前增加一個header引數:
1 @Bean 2 public Docket createRestApi() { 3 4 List<Parameter> pars = new ArrayList<>(); 5 //新增授權token 6 ParameterBuilder tokenPar = new ParameterBuilder(); 7 tokenPar.name("token").description("授權token 注:登入不需要填,只有post方式的介面必填"). 8 modelRef(new ModelRef("string")). 9 parameterType("header").required(false).build(); 10 pars.add(tokenPar.build()); 11 12 return new Docket(DocumentationType.SWAGGER_2) 13 .select() 14 .paths(Predicates.not(PathSelectors.regex("/error.*"))) 15 .build() 16 .globalOperationParameters(pars) 17 .apiInfo(apiInfo()); 18 }
這個時候每個action介面文件塊中都會增加一個token列,type是header型別:
3.新增上傳檔案列
通常api介面都包含一個公共上傳介面,為了讓swagger文件更方便,我們需要讓她支援下上傳;首先這樣定義一個上傳介面:
1 @PostMapping(value = "/upload",headers = "content-type=multipart/form-data") 2 @ApiOperation(value = "上傳") 3 public BaseRp upload(@ApiParam(value = "上傳的檔案",required = true) @RequestBody MultipartFile file) { 4 BaseRp rp = new BaseRp(); 5 6 rp.setMessage("上傳檔名:"+file.getOriginalFilename()); 7 8 return rp; 9 }
其他就不用再設定了,僅僅如此執行後效果:
咋們點選“選擇檔案”測試下上傳,點選try能夠得到如下成功執行的效果圖: