一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。
swagger是一款方便展示的API文档框架。它可以将接口的类型最全面的展示给对方开发人员,避免了手写文档的片面和误差行为。
具体的说明可以看下:https://blog.csdn.net/i6448038/article/details/77622977 讲的很详细。
swagger目前有两种swagger和swagger2,1比较麻烦,不考虑使用,本文主要记录我用swagger2做对外接口的两种方式,方面后面查阅。
一、使用传统的springmvc整合swagger2
1、maven依赖
com.fasterxml.jackson.core
jackson-core
2.8.0
com.fasterxml.jackson.core
jackson-databind
2.6.3
com.fasterxml.jackson.core
jackson-annotations
2.6.3
io.springfox
springfox-swagger2
2.4.0
io.springfox
springfox-swagger-ui
2.4.0
2、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也可以,不知道什么情况):
注意:基本的springmvc配置我就不贴了,需要注意的是,如果你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中拦截器的配置。
3、然后是swagger2的配置类:
@Configuration
@EnableSwagger2public class SwaggerConfig extendsWebMvcConfigurationSupport {
@BeanpublicDocket createRestApi() {return newDocket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("net.laoyeyey.yyblog"))
.paths(PathSelectors.any())
.build();
}privateApiInfo apiInfo() {return newApiInfoBuilder()
.title("yyblog项目 RESTful APIs")
.description("yyblog项目api接口文档")
.version("1.0")
.build();
}
}
注意:paths如果在生产情况下可以调整为PathSelectors.none(),及不显示所有接口信息;
4、接口信息配置
即在SpringMvc的Controller中配置相关的接口信息
@Controller
@RequestMapping(value= "aitou")
@Api(description= "测试服务-账户信息查询")public classDailyOperationDataController {
Logger logger= Logger.getLogger(DailyOperationDataController.class);
@AutowiredprivateDailyOperationDataService DailyOperationDataService;
@ApiOperation(value= "账户信息查询接口")
@RequestMapping(method={RequestMethod.POST,RequestMethod.GET}, value="/query/dailydata/{dataDate}")
@ResponseBodypublic DailyOperationDataDto getDailyReportByDataDate(@PathVariable("dataDate") String dataDate) {try{returnDailyOperationDataService.getDailyReportByDataDate(dataDate);
}catch(Exception e) {
logger.error(e.getMessage(), e);
}return null;
}
}
注:通常情况下swagger2会将扫描包下所有的接口展示出来,这里我是对外的接口是单独一个包,避免展示过多的接口,当然接口方法也可以让它不展示。可以在下面看到相关的注解中有写。
常用的一些注解
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiIgnore:使用该注解忽略这个API
基本上就是上面这些了,是不是很easy,下面看下效果图
二、使用springboot整合swagger2
上面说了使用传统的springmvc整合swagger2,在说说最近比较流行的springmvc的方式,其实原理都是一样的。
1、maven依赖
io.springfox
springfox-swagger2
2.7.0
io.springfox
springfox-swagger-ui
2.7.0
这个是我最近用springboot写的个人项目中的内用,版本用的2.7.0
2、添加静态资源配置
@Configurationpublic class WebMvcConfig extendsWebMvcConfigurerAdapter {/*** 配置静态资源路径以及上传文件的路径
*
*@paramregistry*/@Overridepublic voidaddResourceHandlers(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.
3、swagger2的配置类
和上面一样,基本上没区别
@Configuration
@EnableSwagger2
@EnableWebMvcpublic class SwaggerConfig extendsWebMvcConfigurationSupport {
@BeanpublicDocket createRestApi() {return newDocket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("net.laoyeye.yyblog.web.frontend"))
.paths(PathSelectors.none())
.build();
}privateApiInfo apiInfo() {return newApiInfoBuilder()
.title("yyblog项目 RESTful APIs")
.description("yyblog项目api接口文档")
.version("1.0")
.build();
}
}
注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#)
4、接口的配置
/*** 前台文章Controller
*@author小卖铺的老爷爷
* @date 2018年5月5日
* @website www.laoyeye.net*/@Api(description="文章查询")
@Controller
@RequestMapping("/article")public classArticleController {
@AutowiredprivateArticleService articleService;
@AutowiredprivateSettingService settingService;
@AutowiredprivateCateService cateService;
@AutowiredprivateTagReferService tagReferService;
@AutowiredprivateUserService userService;
@AutowiredprivateArticleMapper articleMapper;
@AutowiredprivateCommentService 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 settings =settingService.listAll();
Map map = new HashMap();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= newCommentQuery();
query.setLimit(10);
query.setPage(1);
query.setArticleId(id);
model.addAttribute("comments", commentService.listCommentByArticleId(query));return "frontend/article";
}
@ApiOperation(value="文章评论查询接口")
@PostMapping("/comments")
@ResponseBodypublicDataGridResult comments(CommentQuery query) {//设置默认10
query.setLimit(10);returncommentService.listCommentByArticleId(query);
}
@ApiOperation(value="文章点赞接口")
@ApiImplicitParam(name= "articleId", value = "文章ID", required = true, dataType = "Long")
@PostMapping("/approve")
@ResponseBodypublicYYBlogResult approve(@RequestParam Long articleId) {returnarticleService.updateApproveCntById(articleId);
}
}
最后同样来个效果图,和上面一样。
PathSelectors.none()的时候
PathSelectors.any()的时候
看到效果图是不是接口内容一目了然,很简洁明了了。
最后,好像忘记说swagger文档的路径了
如果你的项目在根目录:http://localhost:8080/swagger-ui.html
如果不是根目录那就是:http://localhost:8080/你的项目名/swagger-ui.html