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

目录
相关文章
|
1天前
|
缓存 Java API
从零到一:构建一个高效的 RESTful API 服务
本文将详细介绍如何从头开始设计和实现一个高效的 RESTful API 服务。我们将探讨 API 设计的最佳实践、选择合适的技术栈、实现常见功能(如认证、数据验证、错误处理)以及优化性能的策略。通过实例代码和实际应用场景的分析,读者将能够掌握构建高效且易于维护的 API 服务的关键步骤和技巧。
|
5天前
|
Java API Spring
springboot集成swagger
这篇文章介绍了如何在Spring Boot项目中集成Swagger 2.10.0来生成API文档,包括添加依赖、编写配置类、创建接口文档,并使用Knife4j美化Swagger界面。
|
7天前
|
Java API 数据库
【神操作!】Spring Boot打造RESTful API:从零到英雄,只需这几步,让你的Web应用瞬间飞起来!
【8月更文挑战第12天】构建RESTful API是现代Web开发的关键技术之一。Spring Boot因其实现简便且功能强大而深受开发者喜爱。本文以在线图书管理系统为例,展示了如何利用Spring Boot快速构建RESTful API。从项目初始化、实体定义到业务逻辑处理和服务接口实现,一步步引导读者完成API的搭建。通过集成JPA进行数据库操作,以及使用控制器类暴露HTTP端点,最终实现了书籍信息的增删查改功能。此过程不仅高效直观,而且易于维护和扩展。
19 1
|
8天前
|
缓存 测试技术 API
从零到一:构建高效的 RESTful API 服务器
在当今的软件开发环境中,RESTful API 是实现系统间数据交互的关键组件。本文探讨了如何从头开始构建一个高效的 RESTful API 服务器,包括技术选型、架构设计、性能优化等方面的内容。我们将以 Python 的 Flask 框架为例,展示如何设计一个可扩展且高性能的 API 服务器,并提供实际代码示例来说明最佳实践。
|
3天前
|
存储 缓存 API
深入理解RESTful API设计原则与实践
【7月更文挑战第47天】在当今互联网应用的构建中,后端系统通常需要通过API与前端或其他服务进行通信。本文将探讨RESTful API的设计原则,并通过实例展示如何在实践中有效地应用这些原则来创建易于维护、可扩展且用户友好的后端服务接口。我们将分析RESTful架构风格的核心概念,包括资源、统一接口、无状态性和分层系统,并讨论如何在真实世界中实现这些理论。
|
JSON 缓存 JavaScript
SpringBoot学习笔记(五、Restful与json)
SpringBoot学习笔记(五、Restful与json)
194 0
SpringBoot学习笔记(五、Restful与json)
|
20天前
|
机器学习/深度学习 API iOS开发
探索iOS开发中的SwiftUI框架深入理解RESTful API设计原则与最佳实践
【7月更文挑战第30天】本文深入探讨了SwiftUI框架在iOS开发中的应用,分析了其对用户界面构建的简化方法及性能优化。通过比较传统UI构建方式与SwiftUI的差异,揭示了SwiftUI如何提高开发效率和用户体验。文章还讨论了SwiftUI在实际项目中的集成策略,并展望了其未来的发展方向。 【7月更文挑战第30天】在数字时代的浪潮中,RESTful API如同一座桥梁,连接着不同的软件系统。本文将探讨RESTful API的核心设计原则,揭示其背后的哲学思想,并通过实例分析展示如何将这些原则应用于实际开发中。我们将从资源定位、接口一致性到HTTP方法的恰当使用,逐一剖析,旨在为开发者提供
38 1
|
2天前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
13天前
|
JavaScript API 开发者
RESTful API 设计的传奇征程:突破常规,拥抱最佳实践,铸就编程巅峰!
【8月更文挑战第7天】希望通过以上的探讨,能让您对 RESTful API 设计有更深入的理解和认识。
37 5