利⽤Swagger2⾃动⽣成对外接⼝的⽂档
⼀直以来做对外的接⼝⽂档都⽐较原始,基本上都是⼿写的⽂档传来传去,最近发现了⼀个新玩具,可以在接⼝上省去不少⿇烦。
swagger是⼀款⽅便展⽰的API⽂档框架。它可以将接⼝的类型最全⾯的展⽰给对⽅开发⼈员,避免了⼿写⽂档的⽚⾯和误差⾏为。
swagger⽬前有两种swagger和swagger2两种,1⽐较⿇烦,所以不考虑使⽤。本⽂主要记录我⽤swagger2做对外接⼝的两种⽅式,⽅⾯后⾯查阅。⼀、使⽤传统的springmvc整合swagger2
1、maven依赖
<!--springfox依赖-->
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.</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>
2、l 中添加映射静态的配置(其实我项⽬中把这个去掉也可以,不知道什么情况):
<!-- 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 界⾯出来,但却⼀⽚空⽩,请检查下你l中的配置,⼀定要springmvc先拦截到,然后界⾯才会显⽰的。
3、然后是swagger2的配置类:
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("blog"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("yyblog项⽬ RESTful APIs")
.description("yyblog项⽬api接⼝⽂档")
.
version("1.0")
.build();
}
}
注意:paths如果在⽣产情况下可以调整为(),即不显⽰所有接⼝信息;
4、接⼝信息配置
即在SpringMvc的Controller中配置相关的接⼝信息
@Controller
@RequestMapping(value = "aitou")
@Api(description = "测试服务-账户信息查询")
public class DailyOperationDataController {
Logger logger = Logger(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 {
DailyReportByDataDate(dataDate);
} catch (Exception e) {
<(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,下⾯看下效果图
⼆、使⽤springboot整合swagger2
上⾯说了使⽤传统的springmvc整合swagger2,在说说最近⽐较流⾏的springboot的⽅式,其实原理都是⼀样的。
1、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
2、添加静态资源配置
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {/**
* 配置静态资源路径以及上传⽂件的路径
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/upload/**").Property("sources.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
@EnableWebMvc
public class SwaggerConfig extends WebMvcConfigurationSupport {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("blog.web.frontend"))
.())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("yyblog项⽬ RESTful APIs")
.description("yyblog项⽬api接⼝⽂档")
.version("1.0")
.build();
}
}
注意,我上⾯有说path的问题哦,直接拷贝不显⽰api的,(#^.^#)
4、接⼝的配置
/**
* 前台⽂章Controller
* @author⼩卖铺的⽼爷爷
* @date 2018年5⽉5⽇
* @website www.laoyeye
*/
@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);mvc的controller
} catch (Exception ignore) {
}
List<Setting> settings = settingService.listAll();
Map<String,Object> map = new HashMap<String,Object>();
for (Setting setting : settings) {
map.Code(), Value());
}
Article article = ArticleById(id);
model.addAttribute("settings", map);
model.addAttribute("cateList", cateService.listAllCate());
model.addAttribute("article", article);
model.addAttribute("tags", tagReferService.Id()));
model.addAttribute("author", AuthorId()));
//回头改
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.any()的时候
看到效果图是不是接⼝内容⼀⽬了然,很简洁明了了。
最后,好像忘记说swagger⽂档的路径了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论