后端 API 接口文档 Swagger 使用指南
yuyutoo 2024-10-12 01:50 1 浏览 0 评论
优质文章,及时送达
作者 | Yrion
链接 | cnblogs.com/wyq178/p/10291447.html
前言:作为一个以前后端分离为模式开发小组,我们每隔一段时间都进行这样一个场景:前端人员和后端开发在一起热烈的讨论"哎,你这参数又变了啊","接口怎么又请求不通了啊","你再试试,我打个断点调试一下.."。可以看到在前后端沟通中出现了不少问题。对于这样的问题,之前一直没有很好的解决方案,直到它的出现,没错...这就是我们今天要讨论的神器:swagger,一款致力于解决接口规范化、标准化、文档化的开源库,一款真正的开发神器。
目录
一:swagger是什么?
二:为什么要使用swaager?
三:如何搭一个swagger?
四:如何在项目中集成swagger
五:使用swagger需要注意的问题
六:总结
一:swagger是什么?
Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。这个解释简单点来讲就是说,swagger是一款可以根据resutful风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。
二:为什么要使用swaager?
2.1:对于后端开发人员来说
①:不用再手写WiKi接口拼大量的参数,避免手写错误
②:用起来很简单,采用全注解的方式,开发简单
③:方法参数名修改、增加、减少参数都可以直接生效,不用手动维护
④:缺点:增加了开发成本,写接口还得再写一套参数配置
2.2:对于前端开发来说
①:后端只需要定义好接口,会自动生成文档,接口功能、参数一目了然
②:联调方便,如果出问题,直接测试接口,实时检查参数和返回值,就可以快速定位是前端还是后端的问题
2.3:对于测试
①对于某些没有前端界面UI的功能,可以用它来测试接口
②操作简单,不用了解具体代码就可以操作
三:如何搭一个swagger
3.1:引入swagger的依赖,目前推荐使用2.7.0版本,因为2.6.0版本有bug,而其他版本又没有经过验证,所以在比较保守的情况下,我比较推荐的版本是2.7.0,并且它是经过我验证的。
欢迎关注微信公众号:Java后端
一:引入Swagger依赖库
<!--引入swagger-->
<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>
3.2:springBoot整合swagger
springboot整合swagger,只需要添加一个swagger的配置类,添加上@bean注解,就可以实现Bean的注入,然后添加一个ApiInfo的配置,添加注解扫描,其实对于扫描这里,配置分类两类,一个是包的路径扫描,一个是按照注解的扫描,我比价推荐的方式是按照注解,因为在swageer的实际使用中,你得在每个api中添加@APi的注解,但是如果配置成包的话,有可能会有遗漏,或者新增加包路径可能忘了配置,就导致配置无效。
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket productApi {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo)
.select
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //添加ApiOperiation注解的被扫描
.paths(PathSelectors.any)
.build;
}
private ApiInfo apiInfo {
return new ApiInfoBuilder.title(”swagger和springBoot整合“).description(”swagger的API文档")
.version("1.0").build;
}
}
3.3:swagger的注解
swagger的核心在于注解,接下来就着重讲一下swagger的注解:
这是我整理的一个表格,基本上囊括了swagger的常用注解,表格说的很清晰了,我就不一一赘述了,下面会给出具体的应用实际例子:
四:在项目中集成swagger
4.1:在controller中使用注解
/**
* @Auther: wyq
* @Date: 2018/12/29 14:50
*/
@RestController
@Api(value = "电影Controller", tags = { "电影访问接口" })
@RequestMapping("/film")
public class FilmController {
@Autowired
private FilmService filmService;
/**
* 添加一个电影数据
*
* @param
* @return
*/
@ApiOperation(value = "添加一部电影")
@PostMapping("/addFilm")
@ApiResponses(value = { @ApiResponse(code = 1000, message = "成功"), @ApiResponse(code = 1001, message = "失败"),
@ApiResponse(code = 1002, response = Film.class,message = "缺少参数") })
public ResultModel addFilm(@ApiParam("电影名称") @RequestParam("filmName") String filmName,
@ApiParam(value = "分数", allowEmptyValue = true) @RequestParam("score") Short score,
@ApiParam("发布时间") @RequestParam(value = "publishTime",required = false) String publishTime,
@ApiParam("创建者id") @RequestParam("creatorId") Long creatorId) {
if (Objects.is(filmName) || Objects.is(score) || Objects.is(publishTime) || StringUtils
.isEmpty(creatorId)) {
return new ResultModel(ResultModel.failed, "参数错误");
}
Film filmPOM = new Film;
filmPOM.setFilmName(filmName);
filmPOM.setScore(score);
DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date publishTimeDate = ;
try {
publishTimeDate = simpleDateFormat.parse(publishTime);
} catch (Exception ex) {
ex.printStackTrace;
}
filmPOM.setPublishTime(publishTimeDate);
filmPOM.setCreatorId(creatorId);
Boolean result = filmService.addFilm(filmPOM);
if (result) {
return new ResultModel(CommonConstants.SUCCESSMSG);
}
return new ResultModel(CommonConstants.FAILD_MSG);
}
/**
* 根据电影名字获取电影
*
* @param fileName
* @return
*/
@GetMapping("/getFilms")
@ApiOperation(value = "根据名字获取电影")
@ApiResponses(value = { @ApiResponse(code = 1000, message = "成功"), @ApiResponse(code = 1001, message = "失败"),
@ApiResponse(code = 1002, message = "缺少参数") })
public ResultModel getFilmsByName(@ApiParam("电影名称") @RequestParam("fileName") String fileName) {
if (StringUtils.isEmpty(fileName)) {
return CommonConstants.getErrorResultModel;
}
List<Film> films = filmService.getFilmByName(fileName);
if (!CollectionUtils.isEmpty(films)) {
return new ResultModel(films);
}
return CommonConstants.getErrorResultModel;
}
/**
* 根据电影名更新
*
* @return
*/
@PostMapping("/updateScore")
@ApiOperation(value = "根据电影名修改分数")
@ApiResponses(value = { @ApiResponse(code = 1000, message = "成功"), @ApiResponse(code = 1001, message = "失败"),
@ApiResponse(code = 1002, message = "缺少参数") })
public ResultModel updateFilmScore(@ApiParam("电影名称") @RequestParam("fileName") String fileName,
@ApiParam("分数") @RequestParam("score") Short score) {
if (StringUtils.isEmpty(fileName) || Objects.is(score)) {
return CommonConstants.getErrorResultModel;
}
filmService.updateScoreByName(fileName, score);
return CommonConstants.getSuccessResultModel;
}
/**
* 根据电影名删除电影
*
* @param request
* @return
*/
@PostMapping("/delFilm")
@ApiOperation(value = "根据电影名删除电影")
@ApiImplicitParams({ @ApiImplicitParam(name = "filmName",
value = "电影名",
dataType = "String",
paramType = "query",
required = true), @ApiImplicitParam(name = "id", value = "电影id", dataType = "int", paramType = "query") })
public ResultModel deleteFilmByNameOrId(HttpServletRequest request) {
//电影名
String filmName = request.getParameter("filmName");
//电影id
Long filmId = Long.parseLong(request.getParameter("id"));
filmService.deleteFilmOrId(filmName,filmId);
return CommonConstants.getSuccessResultModel;
}
/**
* 根据id获取电影
*
* @param id
* @return
*/
@PostMapping("/{id}")
@ApiOperation("根据id获取电影")
@ApiImplicitParam(name = "id", value = "电影id", dataType = "long", paramType = "path", required = true)
public ResultModel getFilmById(@PathVariable Long id) {
if (Objects.is(id)) {
return CommonConstants.getLessParamResultModel;
}
Film film = filmService.getFilmById(id);
if (Objects.non(film)) {
return new ResultModel(film);
}
return CommonConstants.getErrorResultModel;
}
/**
* 修改整个电影
*
* @param film
* @return
*/
@PostMapping("/insertFilm")
@ApiOperation("插入一部电影")
public ResultModel insertFilm(@ApiParam("电影实体对象") @RequestBody Film film) {
if (Objects.is(film)) {
return CommonConstants.getLessParamResultModel;
}
Boolean isSuccess = filmService.insertFilm(film);
if (isSuccess) {
return CommonConstants.getSuccessResultModel;
}
return CommonConstants.getErrorResultModel;
}
}
4.2:访问本地链接 http://localhost:8080/swagger-ui.html#/
可以看出访问的url都很清晰的展示在它最终的页面上,我们打开一个方法:可以看出方法的请求参数清晰的的罗列出来,包括方法的返回值。并且有一个很重要的功能,只需要点下方的try it out就可以进行接口测试,
五:使用swagger需要注意的问题
①:对于只有一个HttpServletRequest参数的方法,如果参数小于5个,推荐使用 @ApiImplicitParams的方式单独封装每一个参数;如果参数大于5个,采用定义一个对象去封装所有参数的属性,然后使用@APiParam的方式
②默认的访问地址:ip:port/swagger-ui.html#/,但是在shiro中,会拦截所有的请求,必须加上默认访问路径(比如项目中,就是ip:port/context/swagger-ui.html#/),然后登陆后才可以看到
③在GET请求中,参数在Body体里面,不能使用@RequestBody。在POST请求,可以使用@RequestBody和@RequestParam,如果使用@RequestBody,对于参数转化的配置必须统一
④ controller必须指定请求类型,否则swagger会把所有的类型(6种)都生成出来
⑤: swagger在生产环境不能对外暴露,可以使用@Profile({“dev”, “prod”,“pre”})指定可以使用的环境
六:总结
swagger作为一款辅助性的工具,能大大提升我们的和前端的沟通效率,接口是一个非常重要的传递数据的媒介,每个接口的签名、方法参数都非常重要。一个良好的文档非常重要,如果采用手写的方式非常容易拼写错误,而swagger可以自动化生成参数文档,这一切都加快了我们的沟通效率。并且可以替代postman的作用。实在是开发编程必备良品啊。
- END -
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)