springmvc+swagger构建Restful风格文档

简介:   本次和大家分享的是java方面的springmvc来构建的webapi接口+swagger文档;上篇文章分享.net的webapi用swagger来构建文档,因为有朋友问了为啥.net有docpage文档你还用swagger,这里主要目的是让接口文档统一,当操作多种开发语言做接口时,如果有统一风格的api文档是不是很不错;还有就springcloude而言,微服务如果有很多的话,使用swagger自动根据服务serverid来加载api文档是很方便的。

  本次和大家分享的是java方面的springmvc来构建的webapi接口+swagger文档;上篇文章分享.net的webapi用swagger来构建文档,因为有朋友问了为啥.net有docpage文档你还用swagger,这里主要目的是让接口文档统一,当操作多种开发语言做接口时,如果有统一风格的api文档是不是很不错;还有就springcloude而言,微服务如果有很多的话,使用swagger自动根据服务serverid来加载api文档是很方便的。swagger设置比较简单,为了今后查找资料和使用方便故此记录下

  • 准备工作
  • 快速构建api文档
  • 常用的细节
  1. 过滤默认错误api
  2. 添加授权token列
  3. 添加上传文件列

准备工作

  首选需要一个springmvc项目,这里我用的是springboot+maven来快速构建, 要使用swagger只需要在maven中添加依赖包就行:

 1 <dependency>
 2     <groupId>io.springfox</groupId>
 3     <artifactId>springfox-swagger2</artifactId>
 4     <version>2.6.1</version>
 5 </dependency>
 6 <dependency>
 7     <groupId>io.springfox</groupId>
 8     <artifactId>springfox-swagger-ui</artifactId>
 9     <version>2.6.1</version>
10 </dependency>

  然后创建一个UserController,然后再定义个Login的Action,定义请求和响应实体,由于api接口需要对请求和响应属性列做 文字描述,并且上面我们在项目中加了swagger包,因此以直接在实体和Action使用特性来增加具体文字描述:

 1 @RestController
 2 @Api(tags = "会员接口")
 3 public class UserController {
 4 
 5     @PostMapping("/login")
 6     @ApiOperation(value = "登录")
 7     public LoginRp login(@RequestBody LoginRq rq) {
 8         LoginRp rp = new LoginRp();
 9 
10         if (rq.getUserName().isEmpty() || rq.getUserPwd().isEmpty()) {
11             rp.setCode(EmApiCode.登录账号或密码不能为空.getVal());
12             return rp;
13         }
14 
15         if (rq.getUserName().equals("shenniu001") && rq.getUserPwd().equals("123")) {
16             rp.setCode(EmApiCode.成功.getVal());
17 
18             rp.setToken(UUID.randomUUID().toString());
19         } else {
20             rp.setCode(EmApiCode.失败.getVal());
21         }
22         return rp;
23     }
24 
25 }

  请求和响应实体类:

 1 @ApiModel
 2 public class LoginRq implements Serializable{
 3 
 4     private static final long serialVersionUID = -158328750073317876L;
 5 
 6     @ApiModelProperty(value = "登录账号")
 7     private String userName;
 8 
 9     @ApiModelProperty(value = "登录密码")
10     private String userPwd;
11 
12 }
13 
14 @ApiModel
15 public class LoginRp extends BaseRp implements Serializable {
16     private static final long serialVersionUID = -1486838360296425228L;
17 
18     @ApiModelProperty(value = "授权token")
19     private String token;
20 
21     public String getToken() {
22         return token;
23     }
24 
25     public void setToken(String token) {
26         this.token = token;
27     }
28 }
View Code

  注解简单说明:

  @Api:同一类接口的总描述,一般用于Controller标记

  @ApiOperation(value = "登录"):在Action上标记,描述这个Action接口具体干什么

  @ApiModel:请求响应实体类class上的标记

  @ApiModelProperty(value = "登录账号"):请求响应属性上的标记,用来描述该属性具体说明

快速构建api文档

  准备做完后要生成文档,还需要自定义两个封装类,如下Swagger2类:

 1 @Configuration
 2 @EnableSwagger2
 3 public class Swagger2 {
 4 
 5     @Bean
 6     public Docket createRestApi() {
 7 
 8         return new Docket(DocumentationType.SWAGGER_2)
 9                 .select()
10                 //过滤默认错误api
11                 .paths(Predicates.not(PathSelectors.regex("/error.*")))
12                 .build()
13                 .apiInfo(apiInfo());
14     }
15 
16     //常用的细节
17     //过滤指定的action
18     //添加授权token列
19     //添加上传文件列
20     private ApiInfo apiInfo() {
21         return new ApiInfoBuilder()
22                 .title("开车接口文档")
23                 .description("该文档只允许我使用")
24                 //版本
25                 .version("0.0.0.1")
26                 .contact("作者:841202396@qq.com")
27                 .build();
28     }
29 }

  这个类主要初始化一些全局文档的说明和版本并且构架api文档;上面是生成文档,但是具体文档数据源用从swagger的SwaggerResourcesProvider中来,因此自定义的DocumentationConfig类实现SwaggerResourcesProvider接口,如下:

 1 @Component
 2 @Primary
 3 public class DocumentationConfig implements SwaggerResourcesProvider {
 4     @Override
 5     public List<SwaggerResource> get() {
 6         List resources = new ArrayList<>();
 7         resources.add(swaggerResource("开车接口api", "/v2/api-docs", "0.0.0.1"));
 8         resources.add(swaggerResource("坐车接口api", "/v2/api-docs", "0.0.0.1"));
 9         return resources;
10     }
11 
12     private SwaggerResource swaggerResource(String name, String location, String version) {
13         SwaggerResource swaggerResource = new SwaggerResource();
14         swaggerResource.setName(name);
15         swaggerResource.setLocation(location);
16         swaggerResource.setSwaggerVersion(version);
17         return swaggerResource;
18     }
19 }

  主要加载文档的数据源,数据源主要通过 resources.add(swaggerResource("坐车接口api", "/v2/api-docs", "0.0.0.1")) 添加,倘若你想添加其他api接口源就可以在这里进行配置,直接把/v2/api-docs改成你的url就行,这个地方也是springcloud微服务api添加的入口;当编码完成后我们来看看效果:

  

  能成功加载出我们的login接口,而且有一些说明性的文字;再来看看我们请求和响应的参数是否有说明:

  

  请求和响应都有了相应的说明,是不是挺简单;

常用的细节

  1.过滤默认错误api

  由于springmvc封装有错误的controller,因此swagger也会把这个展示出来,因为是扫描的所有controller来展示swagger文档的,故此我们需要屏蔽这些对于对接方没用的接口;这里通过设置paths的不匹配就行了,以下代码:

1 //过滤默认错误api
2 paths(Predicates.not(PathSelectors.regex("/error.*")))

  2.添加授权token列

  对于接口验证来说通常需要个token并且放在header里面,这里我们直接在swagger上增加一个显示的token,只需要在build之前增加一个header参数:

 1 @Bean
 2     public Docket createRestApi() {
 3 
 4         List<Parameter> pars = new ArrayList<>();
 5         //添加授权token
 6         ParameterBuilder tokenPar = new ParameterBuilder();
 7         tokenPar.name("token").description("授权token 注:登录不需要填,只有post方式的接口必填").
 8                 modelRef(new ModelRef("string")).
 9                 parameterType("header").required(false).build();
10         pars.add(tokenPar.build());
11 
12         return new Docket(DocumentationType.SWAGGER_2)
13                 .select()
14                 .paths(Predicates.not(PathSelectors.regex("/error.*")))
15                 .build()
16                 .globalOperationParameters(pars)
17                 .apiInfo(apiInfo());
18    }

  这个时候每个action接口文档块中都会增加一个token列,type是header类型:

  

  3.添加上传文件列

  通常api接口都包含一个公共上传接口,为了让swagger文档更方便,我们需要让她支持下上传;首先这样定义一个上传接口:

1 @PostMapping(value = "/upload",headers = "content-type=multipart/form-data")
2     @ApiOperation(value = "上传")
3     public BaseRp upload(@ApiParam(value = "上传的文件",required = true) @RequestBody MultipartFile file) {
4         BaseRp rp = new BaseRp();
5 
6         rp.setMessage("上传文件名:"+file.getOriginalFilename());
7 
8         return rp;
9     }

  其他就不用再设置了,仅仅如此运行后效果:

  

  咋们点击“选择文件”测试下上传,点击try能够得到如下成功运行的效果图:

  

 

目录
相关文章
|
15天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
31 4
|
1天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
7 2
|
3天前
|
JSON API 数据格式
构建RESTful APIs:使用Python和Flask
构建RESTful APIs:使用Python和Flask
11 1
|
14天前
|
JSON API 数据格式
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
35 1
|
14天前
|
JSON API 数据格式
构建RESTful APIs:使用Python和Flask
【10月更文挑战第12天】本文介绍了如何使用Python和Flask构建一个简单的RESTful API。首先概述了API的重要性及RESTful API的基本概念,接着详细讲解了Flask框架的特性和安装方法。通过创建一个基本的Flask应用,定义了处理“图书”资源的GET、POST、PUT和DELETE方法的路由,展示了如何处理请求和响应,以及如何进行错误处理。最后,提供了运行和测试API的方法,总结了Flask在构建RESTful API方面的优势。
27 1
|
14天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
12 0
|
14天前
|
API 网络架构 Python
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
25 0
|
17天前
|
Java API 数据库
如何使用Spring Boot构建RESTful API,以在线图书管理系统为例
【10月更文挑战第9天】本文介绍了如何使用Spring Boot构建RESTful API,以在线图书管理系统为例,从项目搭建、实体类定义、数据访问层创建、业务逻辑处理到RESTful API的实现,详细展示了每个步骤。通过Spring Boot的简洁配置和强大功能,开发者可以高效地开发出功能完备、易于维护的Web应用。
47 3
|
1天前
|
API 数据安全/隐私保护 开发者
探索RESTful API设计的最佳实践
【10月更文挑战第25天】在数字时代的浪潮中,API成为了连接不同软件组件的桥梁。本文将深入探讨如何设计高效的RESTful API,通过实际代码示例揭示背后的逻辑和结构之美。我们将从基础原则出发,逐步展开到高级概念,旨在为读者提供一套完整的设计蓝图。