Swagger
1、Swagger简介
swagger是一个简单但功能强大的API表达工具,使用Swagger生成API,我们可以得到交互式文档。简单来说就是前台人员在写代码的时候,可以通过访问连接,获取后台返回的json数据包,进行页面效果测试。后台人员在前端页面没有页面的时候也可以进行数据跑通测试。
程序流程:引入swagger依赖,由于接口测试页面并不是我们自己写的静态资源页面,静态页面资源来源于swagger的jar包中,所以需要在启动类中配置相应的资源映射路径。swaggerConfig中配置接口,这里接口有两种,一是Api注解扫描,在codeController中,方法上使用@ApiOperation,进行参数接收,代码生成。二是包扫描配置,将controller包下的所有访问接口展示出来,可以进行单对单的访问,传入对应参数值返回页面。
2、使用界面
两种测试方式:使用注解接口配置访问页面,传入参数,得到返回的json值
使用包扫描,对全部的访问接口进行展示,也可以传递参数
3、开发流程
引入依赖
<groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency>
swaggerConfig.java类开发
这里扫描有两个方式:一种是包含注解扫描,如果方法、方法类上有ApiOperation注解,就会进行接口处理;
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //这里采用包含注解的方式来确定要显示的接口
一种是包扫描,直接指定controller包下的所有请求方法;
.apis(RequestHandlerSelectors.basePackage("com.stylefeng.guns.modular.system.controller")) //这里采用包扫描的方式来确定要显示的接口
完整配置类的代码
package com.stylefeng.guns.config; import io.swagger.annotations.ApiOperation; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 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; /** * swagger配置类 * * @author fengshuonan * @date 2017年6月1日19:42:59 */ @Configuration @EnableSwagger2 @ConditionalOnProperty(prefix = "guns", name = "swagger-open", havingValue = "true") public class SwaggerConfig{ @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //去controller找是否有ApiOperation注解,如果有ApiOperation注解,就会被Spring管理 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //这里采用包含注解的方式来确定要显示的接口 //包扫描 这里就会例举出所有controller下的所有类型方法 这个对单个连接进行传递值 //.apis(RequestHandlerSelectors.basePackage("com.stylefeng.guns.modular.system.controller")) //这里采用包扫描的方式来确定要显示的接口 .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Guns Doc") .description("Guns Api文档") .termsOfServiceUrl("http://git.oschina.net/naan1993/guns") .contact("stylefeng") .version("2.0") .build(); } }
controller访问
注解扫描访问
package com.stylefeng.guns.modular.system.controller; import com.stylefeng.guns.common.annotion.Permission; import com.stylefeng.guns.common.constant.Const; import com.stylefeng.guns.common.exception.BizExceptionEnum; import com.stylefeng.guns.common.exception.BussinessException; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.template.config.ContextConfig; import com.stylefeng.guns.core.template.engine.SimpleTemplateEngine; import com.stylefeng.guns.core.template.engine.base.GunsTemplateEngine; import com.stylefeng.guns.core.util.ToolUtil; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; /** * 代码生成控制器 * * @author fengshuonan * @Date 2017-05-23 18:52:34 */ @Controller @RequestMapping("/code") public class CodeController extends BaseController { private String PREFIX = "/system/code/"; /** * 跳转到代码生成首页 */ @RequestMapping("") public String index() { return PREFIX + "code.html"; } /** * 代码生成 */ @ApiOperation("生成代码") //这里再注解配置完成之后,进入这个类 说明方法的作用 @RequestMapping(value = "/generate", method = RequestMethod.POST) @ResponseBody @Permission(Const.ADMIN_NAME) //RequestParam 参数字段名称 这里还可以ApiImplicitParams 一个数组 ApiImplicitParam单个参数放入数组 public Object add(@ApiParam(value = "模块名称",required = true) @RequestParam String moduleName, @RequestParam String bizChName, //这里表示页面传入的参数名 @RequestParam String bizEnName, @RequestParam String path) { if (ToolUtil.isOneEmpty(bizChName, bizEnName)) { throw new BussinessException(BizExceptionEnum.REQUEST_NULL); } ContextConfig contextConfig = new ContextConfig(); contextConfig.setBizChName(bizChName); contextConfig.setBizEnName(bizEnName); contextConfig.setModuleName(moduleName); if (ToolUtil.isNotEmpty(path)) { contextConfig.setProjectPath(path); } GunsTemplateEngine gunsTemplateEngine = new SimpleTemplateEngine(); gunsTemplateEngine.setContextConfig(contextConfig); gunsTemplateEngine.start(); return super.SUCCESS_TIP; } }
在启动类中还要配置相应的资源访问映射路径,接口页面不是我们自己写的,是引入的依赖包的静态资源。
package com.stylefeng.guns; import com.stylefeng.guns.config.properties.GunsProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * SpringBoot方式启动类 * * @author stylefeng * @Date 2017/5/21 12:06 */ @SpringBootApplication public class GunsApplication extends WebMvcConfigurerAdapter{ protected final static Logger logger = LoggerFactory.getLogger(GunsApplication.class); @Autowired GunsProperties gunsProperties; /** * 增加swagger的支持 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { if(gunsProperties.getSwaggerOpen()){ //请求页面的样式是从依赖的jar来的 ,要使用这些资源比如进行引入 springmvc去寻找这些资源 registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); //告诉spring-mvc请求这个路径 就表示请求特定的静态资源 registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } } public static void main(String[] args) { SpringApplication.run(GunsApplication.class, args); logger.info("GunsApplication is success!"); } }
注解使用
@ApiOperation
用在方法上,说明方法的作用。
@ApiImplicitParams
用在方法上包含一组参数说明
@ApiImplicitParam
用在@ApiImplicitParam中,指定一个参数的作用
paramType:参数放在哪个地方 header-->请求参数的获取:
@RequestHeader query-->请求参数的获取:
@RequestParam path(用于restful接口)-->请求参数的获取:
@PathVariable body(@RequestBody)
form(表单提交)
name:参数名
dataType:参数类型
required:参数是否必须传
value:参数的意思
defaultValue:参数的默认值
由于接口测试页面并不是我们自己写的静态资源页面,静态页面资源来源于swagger的jar包中,所以需要在启动类中配置相应的资源映射路径。