一,什么是swagger?

1,  Swagger 是一个规范和完整的文档框架,

用于生成、描述、调用和可视化 RESTful 风格的 Web 服务文档

官方网站:

  1. https://swagger.io/

2,使用swagger要注意的地方:

在生产环境中必须关闭swagger,

它本身只用于前后端工程师之间的沟通,

可以专门使用一台内部服务器来展示ui供访问,

即使在这上面要做好安全措施

3,  因为swagger3.0.0已发布,本文使用了最新版

如果有还在用2.x版本的请参考时注意区分

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目的相关信息

1,项目地址

  1. https://github.com/liuhongdi/swagger3

2,项目功能说明

演示了使用swagger3.0.0生成接口站的文档,

包括:通用的全局参数,

响应时各种状态的返回

响应的封装后的result格式数据

3,项目结构:如图:

三,配置文件说明

1,pom.xml

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-boot-starter</artifactId>
  4. <version>3.0.0</version>
  5. </dependency>

说明:用springfox-boot-starter来引入swagger

2,application.properties

  1. springfox.documentation.swagger-ui.enabled=true

说明:在生产环境中要设置swagger-ui的enabled值为false,

用来关闭文档的显示

四,java文件说明:

1,Swagger3Config.java

  1. @EnableOpenApi
  2. @Configuration
  3. public class Swagger3Config implements WebMvcConfigurer {
  4.  
  5. @Bean
  6. public Docket createRestApi() {
  7. //返回文档摘要信息
  8. return new Docket(DocumentationType.OAS_30)
  9. .apiInfo(apiInfo())
  10. .select()
  11. //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  12. .apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))
  13. .paths(PathSelectors.any())
  14. .build()
  15. .globalRequestParameters(getGlobalRequestParameters())
  16. .globalResponses(HttpMethod.GET, getGlobalResonseMessage())
  17. .globalResponses(HttpMethod.POST, getGlobalResonseMessage());
  18. }
  19.  
  20. //生成接口信息,包括标题、联系人等
  21. private ApiInfo apiInfo() {
  22. return new ApiInfoBuilder()
  23. .title("Swagger3接口文档")
  24. .description("如有疑问,请联系开发工程师老刘。")
  25. .contact(new Contact("刘宏缔", "https://www.cnblogs.com/architectforest/", "371125307@qq.com"))
  26. .version("1.0")
  27. .build();
  28. }
  29.  
  30. //生成全局通用参数
  31. private List<RequestParameter> getGlobalRequestParameters() {
  32. List<RequestParameter> parameters = new ArrayList<>();
  33. parameters.add(new RequestParameterBuilder()
  34. .name("appid")
  35. .description("平台id")
  36. .required(true)
  37. .in(ParameterType.QUERY)
  38. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  39. .required(false)
  40. .build());
  41. parameters.add(new RequestParameterBuilder()
  42. .name("udid")
  43. .description("设备的唯一id")
  44. .required(true)
  45. .in(ParameterType.QUERY)
  46. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  47. .required(false)
  48. .build());
  49. parameters.add(new RequestParameterBuilder()
  50. .name("version")
  51. .description("客户端的版本号")
  52. .required(true)
  53. .in(ParameterType.QUERY)
  54. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  55. .required(false)
  56. .build());
  57. return parameters;
  58. }
  59.  
  60. //生成通用响应信息
  61. private List<Response> getGlobalResonseMessage() {
  62. List<Response> responseList = new ArrayList<>();
  63. responseList.add(new ResponseBuilder().code("404").description("找不到资源").build());
  64. return responseList;
  65. }
  66. }

说明:生成了全局的参数和通用的响应信息

2,RestResult.java

  1. @ApiModel("api通用返回数据")
  2. public class RestResult<T> {
  3.  
  4. //uuid,用作唯一标识符,供序列化和反序列化时检测是否一致
  5. private static final long serialVersionUID = 7498483649536881777L;
  6. //标识代码,0表示成功,非0表示出错
  7. @ApiModelProperty("标识代码,0表示成功,非0表示出错")
  8. private Integer code;
  9.  
  10. //提示信息,通常供报错时使用
  11. @ApiModelProperty("提示信息,供报错时使用")
  12. private String msg;
  13.  
  14. //正常返回时返回的数据
  15. @ApiModelProperty("返回的数据")
  16. private T data;
  17.  
  18. //constructor
  19. public RestResult() {
  20. }
  21.  
  22. //constructor
  23. public RestResult(Integer status, String msg, T data) {
  24. this.code = status;
  25. this.msg = msg;
  26. this.data = data;
  27. }
  28.  
  29. //返回成功数据
  30. public RestResult success(T data) {
  31. return new RestResult(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMsg(), data);
  32. }
  33.  
  34. public static RestResult success(Integer code,String msg) {
  35. return new RestResult(code, msg, null);
  36. }
  37.  
  38. //返回出错数据
  39. public static RestResult error(ResponseCode code) {
  40. return new RestResult(code.getCode(), code.getMsg(), null);
  41. }
  42.  
  43. public Integer getCode() {
  44. return code;
  45. }
  46. public void setCode(Integer code) {
  47. this.code = code;
  48. }
  49.  
  50. public String getMsg() {
  51. return msg;
  52. }
  53. public void setMsg(String msg) {
  54. this.msg = msg;
  55. }
  56.  
  57. public T getData() {
  58. return data;
  59. }
  60. public void setData(T data) {
  61. this.data = data;
  62. }

说明:这里要注意使用泛型T,如果只用Object,则swagger不能识别我们所返回的数据的类型说明:

其中:ApiModel用于类上面说明功能,

ApiModelProperty用于字段上说明功能

尤其是getData方法的返回数据类型,要用T,使用工具生成的data类容易出现这种错误,

3,Goods.java

  1. @ApiModel("商品模型")
  2. public class Goods {
  3. //商品id
  4. @ApiModelProperty("商品id")
  5. Long goodsId;
  6. public Long getGoodsId() {
  7. return this.goodsId;
  8. }
  9. public void setGoodsId(Long goodsId) {
  10. this.goodsId = goodsId;
  11. }
  12.  
  13. //商品名称
  14. @ApiModelProperty("商品名称")
  15. private String goodsName;
  16. public String getGoodsName() {
  17. return this.goodsName;
  18. }
  19. public void setGoodsName(String goodsName) {
  20. this.goodsName = goodsName;
  21. }
  22.  
  23. //商品标题
  24. @ApiModelProperty("商品标题")
  25. private String subject;
  26. public String getSubject() {
  27. return this.subject;
  28. }
  29. public void setSubject(String subject) {
  30. this.subject = subject;
  31. }
  32.  
  33. //商品价格
  34. @ApiModelProperty("商品价格")
  35. private BigDecimal price;
  36. public BigDecimal getPrice() {
  37. return this.price;
  38. }
  39. public void setPrice(BigDecimal price) {
  40. this.price = price;
  41. }
  42.  
  43. //库存
  44. @ApiModelProperty("商品库存")
  45. int stock;
  46. public int getStock() {
  47. return this.stock;
  48. }
  49. public void setStock(int stock) {
  50. this.stock = stock;
  51. }
  52.  
  53. public String toString(){
  54. return " Goods:goodsId=" + goodsId +" goodsName=" + goodsName+" subject=" + subject+" price=" + price+" stock=" + stock;
  55. }
  56. }

4,GoodsController.java

  1. @Api(tags = "商品信息管理接口")
  2. @RestController
  3. @RequestMapping("/goods")
  4. public class GoodsController {
  5.  
  6. @Operation(summary = "商品详情,针对得到单个商品的信息")
  7. @GetMapping("/one")
  8. public RestResult<Goods> one(@Parameter(description = "商品id,正整数") @RequestParam(value="goodsid",required = false,defaultValue = "0") Integer goodsid) {
  9. Goods goodsone = new Goods();
  10. goodsone.setGoodsId(3L);
  11. goodsone.setGoodsName("电子书");
  12. goodsone.setSubject("学python,学ai");
  13. goodsone.setPrice(new BigDecimal(60));
  14. goodsone.setStock(10);
  15. RestResult res = new RestResult();
  16. return res.success(goodsone);
  17. }
  18.  
  19. @Operation(summary = "提交订单")
  20. @PostMapping("/order")
  21. @ApiImplicitParams({
  22. @ApiImplicitParam(name="userid",value="用户id",dataTypeClass = Long.class, paramType = "query",example="12345"),
  23. @ApiImplicitParam(name="goodsid",value="商品id",dataTypeClass = Integer.class, paramType = "query",example="12345"),
  24. @ApiImplicitParam(name="mobile",value="手机号",dataTypeClass = String.class, paramType = "query",example="13866668888"),
  25. @ApiImplicitParam(name="comment",value="发货备注",dataTypeClass = String.class, paramType = "query",example="请在情人节当天送到")
  26. })
  27.  
  28. public RestResult<String> order(@ApiIgnore @RequestParam Map<String,String> params) {
  29. System.out.println(params);
  30. RestResult res = new RestResult();
  31. return res.success("success");
  32. }
  33. }

说明:Api用来指定一个controller中的各个接口的通用说明

Operation:用来说明一个方法

@ApiImplicitParams:用来包含多个包含多个 @ApiImplicitParam,

@ApiImplicitParam:用来说明一个请求参数

如果使用@Parameter来做说明,可以直接加到@RequestParam参数之前

@ApiIgnore:用来忽略不必要显示的参数

五,效果测试

1,访问文档:访问:

  1. http://127.0.0.1:8080/swagger-ui/index.html

可以看到已有的接口:

2,查看接口的详情:

参数:可以看到我们添加的全局通用参数

响应:

六,查看spring boot的版本

  1. . ____ _ __ _ _
  2. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  3. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  4. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  5. ' |____| .__|_| |_|_| |_\__, | / / / /
  6. =========|_|==============|___/=/_/_/_/
  7. :: Spring Boot :: (v2.3.2.RELEASE)

spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)的更多相关文章

  1. Spring Boot Swagger2自动生成接口文档

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 1.问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 2 ...

  2. SpringBoot整合Swagger3生成接口文档

    前后端分离的项目,接口文档的存在十分重要.与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低.与swagger2相比新版的swagg ...

  3. 接口文档管理工具-Postman、Swagger、RAP(转载)

    接口文档管理工具-Postman.Swagger.RAP 转自:http://www.51testing.com/html/10/n-3715910.html 在项目开发测试中,接口文档是贯穿始终的. ...

  4. Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...

  5. Spring boot 添加日志 和 生成接口文档

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  6. Java | Spring Boot Swagger2 集成REST ful API 生成接口文档

      Spring Boot Swagger2 集成REST ful API 生成接口文档 原文 简介 由于Spring Boot 的特性,用来开发 REST ful 变得非常容易,并且结合 Swagg ...

  7. Springboot集成swagger2生成接口文档

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11509884.html    作者:jstarseven    码字挺辛苦的.....   一 ...

  8. spring-boot-route(六)整合JApiDocs生成接口文档

    上一篇文章中介绍了使用Swagger生成接口文档,非常方便,功能也十分强大.如果非要说Swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注解,就可以生成文档的工具,你心动了吗? ...

  9. SpringBoot接口 - 如何生成接口文档之非侵入方式(通过注释生成)Smart-Doc?

    通过Swagger系列可以快速生成API文档,但是这种API文档生成是需要在接口上添加注解等,这表明这是一种侵入式方式: 那么有没有非侵入式方式呢, 比如通过注释生成文档? 本文主要介绍非侵入式的方式 ...

随机推荐

  1. CSS特效(一)

    三角形 <!-- log --> <div class="tri"></div> <style> .tri { width: 0; ...

  2. 第1课 - 学习 Lua 的意义

    第1课 - 学习 Lua 的意义 1.Lua 简介 (1) 1993年.巴西 (2) 小巧精致的脚本语言,大小只有 200K (3) 用标准C语言写成,能够在所有的平台上编译运行 (4) 发明的目标是 ...

  3. myBatis源码解析-二级缓存的实现方式

    1. 前言 前面近一个月去写自己的mybatis框架了,对mybatis源码分析止步不前,此文继续前面的文章.开始分析mybatis一,二级缓存的实现.附上自己的项目github地址:https:// ...

  4. Go 里的函数

    1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构.将一段功能复杂.很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性. 在 Go 语言中,函数可以分为两种: 带 ...

  5. 刷题[FBCTF2019]Event

    解题思路 信息收集 打开发现是这样的登陆框,信息泄露,弱口令什么的尝试一下,无果,正常注册登陆 发现需要通过admin用户登陆,并且发现有/flag这样的路由,猜测后台为python编写 抓包发现有看 ...

  6. pwnable.kr-uaf-witeup

    没错,这道题超纲了,代码调试能力很差很差. 一些相关小笔记. UAF是在内存释放后,原指针仍然指向此内存,可通过其他填充操作将此内存值设为指定的值,使得指针指向特定值. 分析程序.本程序中,可输入1. ...

  7. python语言开发环境配置

    原作者:龙行天下-super 地址:https://www.cnblogs.com/longxingtianxia/p/10181901.html 要点:IDLE是一个轻量级python语言开发环境, ...

  8. linux系统内存爆满的快速解决办法!

    首先用free工具检查一下内存的使用情况: $ free -m total used free shared buff/cache available Mem: 15884 207 573 145 1 ...

  9. 07 Sublime Text3常用快捷键

    通用常用类(General) ↑↓←→:上下左右移动光标,注意不是不是 KJHL ! Alt:调出菜单 Ctrl + Shift + P:调出命令板(Command Palette) Ctrl + ` ...

  10. matlab中find 查找非零元素的索引和值

    来源:https://ww2.mathworks.cn/help/matlab/ref/find.html?searchHighlight=find&s_tid=doc_srchtitle f ...