SpringBoot使用Swagger2搭建强大的RESTful API 文档功能

简介: swagger用于定义API文档。Swagger2的使用Maven Plugin添加Swagger2相关jar包 1 2 3 io.springfox 4 springfox-swagger2 5 2.

swagger用于定义API文档。

Swagger2的使用

Maven Plugin添加Swagger2相关jar包

 1 <!--swagger2 start-->
 2 <dependency>
 3     <groupId>io.springfox</groupId>
 4     <artifactId>springfox-swagger2</artifactId>
 5     <version>2.2.2</version>
 6 </dependency>
 7 <dependency>
 8     <groupId>io.springfox</groupId>
 9     <artifactId>springfox-swagger-ui</artifactId>
10     <version>2.2.2</version>
11 </dependency>
12 <!--swagger2 end-->
View Code

添加Swagger2配置文件

 1 package com.goku.webapi.config.Swagger;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 import springfox.documentation.builders.ApiInfoBuilder;
 6 import springfox.documentation.builders.PathSelectors;
 7 import springfox.documentation.builders.RequestHandlerSelectors;
 8 import springfox.documentation.service.ApiInfo;
 9 import springfox.documentation.spi.DocumentationType;
10 import springfox.documentation.spring.web.plugins.Docket;
11 import springfox.documentation.swagger2.annotations.EnableSwagger2;
12 
13 /**
14  * Created by nbfujx on 2017-11-14.
15  */
16 @Configuration
17 @EnableSwagger2
18 public class Swagger2Config {
19 
20     @Bean
21     public Docket createRestApi() {
22         return new Docket(DocumentationType.SWAGGER_2)
23                 .apiInfo(apiInfo())
24                 .select()
25                 .apis(RequestHandlerSelectors.basePackage("com.goku.webapi.controller"))
26                 .paths(PathSelectors.any())
27                 .build();
28     }
29 
30     private ApiInfo apiInfo() {
31         return new ApiInfoBuilder()
32                 .title("Goku.WebService.Simple")
33                 .description("Goku.WebService.Simple")
34                 .termsOfServiceUrl("https://github.com/nbfujx")
35                 .contact("nbfujx")
36                 .version("1.0")
37                 .build();
38     }
39 }
View Code

添加文档内容

在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。如下所示,我们通过 @ApiOperation注解来给API增加说明、通过 @ApiImplicitParams@ApiImplicitParam注解来给参数增加说明。同时可以使用 @ApiIgnore来过滤一些不需要展示的接口。
  1 package com.goku.webapi.controller.impl;
  2 
  3 import com.alibaba.fastjson.JSON;
  4 import com.goku.webapi.controller.loginController;
  5 import com.goku.webapi.util.enums.returnCode;
  6 import com.goku.webapi.util.message.returnMsg;
  7 import io.swagger.annotations.Api;
  8 import io.swagger.annotations.ApiImplicitParam;
  9 import io.swagger.annotations.ApiImplicitParams;
 10 import io.swagger.annotations.ApiOperation;
 11 import org.apache.shiro.SecurityUtils;
 12 import org.apache.shiro.authc.AuthenticationException;
 13 import org.apache.shiro.authc.UsernamePasswordToken;
 14 import org.apache.shiro.crypto.hash.Md5Hash;
 15 import org.apache.shiro.session.SessionException;
 16 import org.apache.shiro.subject.Subject;
 17 import org.springframework.beans.factory.annotation.Autowired;
 18 import org.springframework.boot.autoconfigure.web.ErrorAttributes;
 19 import org.springframework.boot.autoconfigure.web.ErrorController;
 20 import org.springframework.http.HttpStatus;
 21 import org.springframework.web.bind.annotation.RequestMapping;
 22 import org.springframework.web.bind.annotation.RequestMethod;
 23 import org.springframework.web.bind.annotation.RequestParam;
 24 import org.springframework.web.bind.annotation.RestController;
 25 import org.springframework.web.context.request.RequestAttributes;
 26 import org.springframework.web.context.request.ServletRequestAttributes;
 27 import springfox.documentation.annotations.ApiIgnore;
 28 
 29 import javax.servlet.http.HttpServletRequest;
 30 import java.util.HashMap;
 31 import java.util.Map;
 32 
 33 
 34 /**
 35  * Created by nbfujx on 2017-11-07.
 36  */
 37 @RestController
 38 @Api(value="登录验证")
 39 public class loginControllerImpl implements loginController,ErrorController {
 40 
 41 
 42     private final static String ERROR_PATH = "/error";
 43 
 44     @Autowired
 45     private ErrorAttributes errorAttributes;
 46 
 47     @ApiOperation(value="用户登录", notes="用户登录校验")
 48     @ApiImplicitParams({
 49         @ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String" ,paramType="query"),
 50         @ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String" ,paramType="query"),
 51         @ApiImplicitParam(name = "rememberMe", value = "记住用户", required = true, dataType = "String" ,paramType="query")
 52     })
 53     @RequestMapping(value = "/login", method = RequestMethod.POST)
 54     public String login(
 55             @RequestParam(value = "username", required = true) String userName,
 56             @RequestParam(value = "password", required = true) String password,
 57             @RequestParam(value = "rememberMe", required = true, defaultValue = "false") boolean rememberMe
 58     ) {
 59         String passwordmd5 = new Md5Hash(password, "2").toString();
 60         Subject subject = SecurityUtils.getSubject();
 61         UsernamePasswordToken token = new UsernamePasswordToken(userName, passwordmd5);
 62         token.setRememberMe(rememberMe);
 63         try {
 64             subject.login(token);
 65         } catch (AuthenticationException e) {
 66             e.printStackTrace();
 67             return JSON.toJSONString (new  returnMsg(returnCode.ERROR));
 68         }
 69         return  JSON.toJSONString (new  returnMsg(returnCode.SUCCESS));
 70     }
 71 
 72 
 73     @Override
 74     @RequestMapping(value = "/logout", method = RequestMethod.POST)
 75     @ApiOperation(value="用户退出", notes="用户退出校验")
 76     public String logout() {
 77         Subject subject = SecurityUtils.getSubject();
 78         try {
 79             subject.logout();
 80         }catch (SessionException e){
 81             e.printStackTrace();
 82             return JSON.toJSONString (new  returnMsg(returnCode.ERROR));
 83         }
 84         return JSON.toJSONString (new  returnMsg(returnCode.SUCCESS));
 85     }
 86 
 87     @Override
 88     @RequestMapping(value = "/notAuthc", method = RequestMethod.GET)
 89     @ApiIgnore
 90     public String notAuthc() {
 91         return JSON.toJSONString (new  returnMsg(returnCode.NOTAUTHC));
 92     }
 93 
 94     @Override
 95     @RequestMapping(value = "/notAuthz", method = RequestMethod.GET)
 96     @ApiIgnore
 97     public String notAuthz() {
 98         return  JSON.toJSONString (new  returnMsg(returnCode.NOTAUTHZ));
 99     }
100 
101     @Override
102     @RequestMapping(value =ERROR_PATH)
103     @ApiIgnore
104     public String error(HttpServletRequest request)
105     {
106         Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
107         return  JSON.toJSONString (new  returnMsg(returnCode.ERROR,body));
108     }
109 
110     @Override
111     public String getErrorPath() {
112         return ERROR_PATH;
113     }
114 
115     private boolean getTraceParameter(HttpServletRequest request) {
116         String parameter = request.getParameter("trace");
117         if (parameter == null) {
118             return false;
119         }
120         return !"false".equals(parameter.toLowerCase());
121     }
122 
123     private Map<String, Object> getErrorAttributes(HttpServletRequest request,boolean includeStackTrace) {
124         RequestAttributes requestAttributes = new ServletRequestAttributes(request);
125         Map<String, Object> map = this.errorAttributes.getErrorAttributes(requestAttributes,includeStackTrace);
126         String URL = request.getRequestURL().toString();
127         map.put("URL", URL);
128         return map;
129     }
130 
131 }
View Code

完成上述代码添加上,启动Spring Boot程序,访问:http://localhost:8080/swagger-ui.html

 

 
注解说明:
  • @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:抛出异常的类
  • @ApiModel:描述一个Model的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)
    • @ApiModelProperty:描述一个model的属性
以上这些就是最常用的几个注解了。


 

GITHUB

github : https://github.com/nbfujx/learn-java-demo/tree/master/Goku.WebService.Simple.Swagger2

目录
相关文章
|
6月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
5500 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
9月前
|
Java API 网络架构
基于 Spring Boot 框架开发 REST API 接口实践指南
本文详解基于Spring Boot 3.x构建REST API的完整开发流程,涵盖环境搭建、领域建模、响应式编程、安全控制、容器化部署及性能优化等关键环节,助力开发者打造高效稳定的后端服务。
1225 1
|
11月前
|
XML JSON API
如何从 Swagger 导出 API 文档
Swagger 使这项任务相对简单,允许开发者以各种格式(如 JSON 和 YAML)导出 API 文档。在这篇博文中,我们将详细探讨如何从 Swagger 导出 API 文档。
如何从 Swagger 导出 API 文档
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
存储 安全 Java
Spring Boot 编写 API 的 10条最佳实践
本文总结了 10 个编写 Spring Boot API 的最佳实践,包括 RESTful API 设计原则、注解使用、依赖注入、异常处理、数据传输对象(DTO)建模、安全措施、版本控制、文档生成、测试策略以及监控和日志记录。每个实践都配有详细的编码示例和解释,帮助开发者像专业人士一样构建高质量的 API。
577 9
|
前端开发 JavaScript Java
SpringBoot实现国际化i18n功能
SpringBoot实现国际化i18n功能
1352 0
SpringBoot实现国际化i18n功能
|
5月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
5月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
5月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。