一直以来作对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,能够在接口上省去很多麻烦。html
swagger是一款方便展现的API文档框架。它能够将接口的类型最全面的展现给对方开发人员,避免了手写文档的片面和偏差行为。git
swagger目前有两种swagger和swagger2两种,1比较麻烦,因此不考虑使用。本文主要记录我用swagger2作对外接口的两种方式,方面后面查阅。github
一、maven依赖web
<!--springfox依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.4.0</version> </dependency>
二、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也能够,不知道什么状况):spring
<!-- swagger静态文件路径 --> <mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/> <mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/>
注意:基本的springmvc配置我就不贴了,须要注意的是,若是你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中拦截器的配置,必定要springmvc先拦截到,而后界面才会显示的。api
三、而后是swagger2的配置类:spring-mvc
@Configuration @EnableSwagger2 public class SwaggerConfig extends WebMvcConfigurationSupport { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("net.laoyeyey.yyblog")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("yyblog项目 RESTful APIs") .description("yyblog项目api接口文档") .version("1.0") .build(); } }
注意:paths若是在生产状况下能够调整为PathSelectors.none(),即不显示全部接口信息;springboot
四、接口信息配置restful
即在SpringMvc的Controller中配置相关的接口信息mvc
@Controller @RequestMapping(value = "aitou") @Api(description = "测试服务-帐户信息查询") public class DailyOperationDataController { Logger logger = Logger.getLogger(DailyOperationDataController.class); @Autowired private DailyOperationDataService DailyOperationDataService; /*
* @ApiOperation(value = "接口说明", httpMethod ="接口请求方式", response ="接口返回参数类型", notes ="接口发布说明"
* @ApiParam(required = "是否必须参数", name ="参数名称", value ="参数具体描述"
*/ @ApiOperation(value = "帐户信息查询接口") @RequestMapping(method ={RequestMethod.POST,RequestMethod.GET}, value="/query/dailydata/{dataDate}") @ResponseBody public DailyOperationDataDto getDailyReportByDataDate(@PathVariable("dataDate") String dataDate) { try { return DailyOperationDataService.getDailyReportByDataDate(dataDate); } catch (Exception e) { logger.error(e.getMessage(), e); } return null; } }
注:一般状况下swagger2会将扫描包下全部的接口展现出来,这里我是对外的接口是单独一个包,避免展现过多的接口,固然接口方法也可让它不展现。能够在下面看到相关的注解中有写。
经常使用的一些注解
@Api:用在类上,说明该类的做用
@ApiOperation:用在方法上,说明方法的做用
@ApiImplicitParams:用在方法上包含一组参数说明
@ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的各个方面
paramType:参数放在哪一个地方
· header --> 请求参数的获取:@RequestHeader
· query -->请求参数的获取:@RequestParam
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(不经常使用)
· form(不经常使用)
name:参数名
dataType:参数类型
required:参数是否必须传
value:参数的意思
defaultValue:参数的默认值
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,通常用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类
@ApiParam:单个参数描述
@ApiModel:描述一个Model的信息,用对象来接收参数(这种通常用在post建立的时候,使用@RequestBody这样的场景,请求参数没法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:描述一个model的属性
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiIgnore:使用该注解忽略这个API
基本上就是上面这些了,是否是很easy,下面看下效果图
上面说了使用传统的springmvc整合swagger2,在说说最近比较流行的springboot的方式,其实原理都是同样的。
一、maven依赖
<!--springfox依赖 --> <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>
这个是我最近用springboot写的我的项目中的内用,版本用的2.7.0
二、添加静态资源配置
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter {/** * 配置静态资源路径以及上传文件的路径 * * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/upload/**").addResourceLocations(environment.getProperty("spring.resources.static-locations")); /*swagger-ui*/ registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
其实就是最后两句,若是你不配置这个的话,访问swagger-ui.html会出现500,仍是404的错误来着,记不清了,应该是404.
三、swagger2的配置类
和上面同样,基本上没区别
@Configuration @EnableSwagger2 @EnableWebMvc public class SwaggerConfig extends WebMvcConfigurationSupport { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("net.laoyeye.yyblog.web.frontend")) .paths(PathSelectors.none()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("yyblog项目 RESTful APIs") .description("yyblog项目api接口文档") .version("1.0") .build(); } }
注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#)
四、接口的配置
/** * 前台文章Controller * @author 小卖铺的老爷爷 * @date 2018年5月5日 * @website www.laoyeye.net */ @Api(description="文章查询") @Controller @RequestMapping("/article") public class ArticleController { @Autowired private ArticleService articleService; @Autowired private SettingService settingService; @Autowired private CateService cateService; @Autowired private TagReferService tagReferService; @Autowired private UserService userService; @Autowired private ArticleMapper articleMapper; @Autowired private CommentService commentService; @ApiOperation(value="文章查询接口") @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long") @GetMapping("/{id}") public String index(Model model, @PathVariable("id") Long id) { try { articleService.updateViewsById(id); } catch (Exception ignore) { } List<Setting> settings = settingService.listAll(); Map<String,Object> map = new HashMap<String,Object>(); for (Setting setting : settings) { map.put(setting.getCode(), setting.getValue()); } Article article = articleService.getArticleById(id); model.addAttribute("settings", map); model.addAttribute("cateList", cateService.listAllCate()); model.addAttribute("article", article); model.addAttribute("tags", tagReferService.listNameByArticleId(article.getId())); model.addAttribute("author", userService.getNicknameById(article.getAuthorId())); //回头改 model.addAttribute("articles", articleMapper.listArticleByTitle(null)); model.addAttribute("similars", articleMapper.listArticleByTitle(null)); CommentQuery query = new CommentQuery(); query.setLimit(10); query.setPage(1); query.setArticleId(id); model.addAttribute("comments", commentService.listCommentByArticleId(query)); return "frontend/article"; } @ApiOperation(value="文章评论查询接口") @PostMapping("/comments") @ResponseBody public DataGridResult comments(CommentQuery query) { //设置默认10 query.setLimit(10); return commentService.listCommentByArticleId(query); } @ApiOperation(value="文章点赞接口") @ApiImplicitParam(name = "articleId", value = "文章ID", required = true, dataType = "Long") @PostMapping("/approve") @ResponseBody public YYBlogResult approve(@RequestParam Long articleId) { return articleService.updateApproveCntById(articleId); } }
最后一样来个效果图,和上面同样。
PathSelectors.none()的时候

PathSelectors.any()的时候


看到效果图是否是接口内容一目了然,很简洁明了了。
最后,好像忘记说swagger文档的路径了
若是你的项目在根目录:http://localhost:8080/swagger-ui.html
若是不是根目录那就是:http://localhost:8080/你的项目名/swagger-ui.html
实例地址:http://www.laoyeye.net/management/index 帐号/密码:test/123456 菜单:系统设置/接口文档