Swagger是什麼?Swagger 是一個規範且完整的框架,用於生成、描述、調用和可視化 RESTful 風格的 Web 服務。Swagger 的目標是對 REST API 定義一個標準且和語言無關的接口,可讓人和計算機擁有無須訪問源碼、文檔或網絡流量監測就能夠發現和理解服務的能力。當經過 Swagger 進行正肯定義,用戶能夠理解遠程服務並使用最少實現邏輯與遠程服務進行交互。與爲底層編程所實現的接口相似,Swagger 消除了調用服務時可能會有的猜想。html
SpringBoot集成Swagger很方便,接下來將演示如何集成java
首先pom.xml引入相關依賴程序員
<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>
建立Swagger配置類web
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.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2018年9月3日 下午1:47:48 * Description : */ @EnableSwagger2 @Configuration public class SwaggerConfigurer { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select().apis(RequestHandlerSelectors.basePackage("com.wusy.demo")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { ApiInfoBuilder builder = new ApiInfoBuilder(); builder.title("spring-boot-wusy-demo"); builder.description("spring-boot-wusy-demo rest full api文檔"); builder.version("1.0"); return builder.build(); } }
這裏記住@EnableSwagger2這個註解是必不可少的,最後編寫Rest Full接口spring
import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2020/3/4 23:22 * Description : */ @Api(tags = {"Swagger集成演示相關接口"}) @RestController @RequestMapping("/api/swagger") public class SwaggerDemoController { @ApiOperation("Swagger集成示例") @RequestMapping(value = "/demo", method = RequestMethod.GET) public String demo(@ApiParam(required = true , name = "param") String param) { return param; } }
到這裏集成Swagger完成,接下來咱們啓動項目而後在瀏覽器中輸入http://127.0.0.1:8787/swagger-ui.html,觀察結果編程
提示出錯了,這裏提示base url被攔截了,經過觀察網絡請求發現api
經過分析原來是以前在配置自定義方法接口的時候把swapper接口也給攔截了,因此要原來的改造下瀏覽器
/** * @author wusy * Company: xxxxxx科技有限公司 * Createtime : 2020/2/28 22:04 * Description : rest full 全局統一返回封裝 */ @RestControllerAdvice public class GlobalControllerAdvice implements ResponseBodyAdvice<Object> { private Logger logger = LoggerFactory.getLogger(GlobalControllerAdvice.class); /** * 須要忽略的地址 */ private static String[] ignores = new String[]{ //過濾swagger相關的請求的接口,否則swagger會提示base-url被攔截 "/swagger-resources", "/v2/api-docs" }; /** * 判斷哪些須要攔截 * @param returnType * @param converterType * @return */ @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return true; } /** * 判斷url是否須要攔截 * @param uri * @return */ private boolean ignoring(String uri) { for (String string : ignores) { if (uri.contains(string)) { return true; } } return false; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { //判斷url是否須要攔截 if (this.ignoring(request.getURI().toString())) { return body; } //若是返回的數據是ResultObjectModel、Byte類型則不進行封裝 if( body instanceof ResultObjectModel || body instanceof Byte || body instanceof String) { return body; } return this.getWrapperResponse(request , body); } /** * 返回正常的信息 * @param request * @param data * @return */ private ResultObjectModel<Object> getWrapperResponse(ServerHttpRequest request, Object data) { return new ResultObjectModel<>(true, "請求成功" , data); } }
重啓應用,這裏要重啓瀏覽器後訪問http://127.0.0.1:8787/swagger-ui.html,觀察結果網絡
至此Swagger集成成功。app
集成Swagger的時候要注意如下幾點:
一、@EnableSwagger2註解必定要添加
二、自定義接口ResponseBodyAdvice中是否對swagger的相關接口作了處理,本次演示中就是由於這個問題致使出現問題
三、過濾器是否對swagger的相關接口作了處理
四、集成security時若是swagger不須要登錄就能訪問的話應該要對swagger的相關進行不攔截
@Override public void configure(WebSecurity web) { //swagger相關的頁面和接口不攔截 web.ignoring().antMatchers("/swagger-ui.html") .antMatchers("/webjars/springfox-swagger-ui/**") .antMatchers("/swagger-resources/**" ) .antMatchers("/v2/api-docs/**"); }