博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微服务架构实战篇(二):Spring boot2.0 + Swagger2 让你的API可视化
阅读量:7023 次
发布时间:2019-06-28

本文共 5973 字,大约阅读时间需要 19 分钟。

简介

该项目主要利用Spring boot2.0 +Swagger2 方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后台的接口修改了后,swagger可以实现自动的更新,而不需要认为的维护这个接口进行测试。

  • 源码地址
    • GitHub:
  • 联盟公众号:IT实战联盟
  • 我们社区:

小工具一枚,欢迎使用和Star支持,如使用过程中碰到问题,可以提出Issue,我会尽力完善该Starter

版本基础

  • Spring Boot:2.0.4
  • Swagger2:2.7.0

操作步骤

第一步:下载SpringBoot2.0项目

  • GitHub地址:
  • 参考文档:

第二步:添加maven依赖

io.springfox
springfox-swagger2
2.7.0
io.springfox
springfox-swagger-ui
2.7.0
org.apache.tomcat.embed
tomcat-embed-jasper
org.springframework.boot
spring-boot-starter-tomcat
provided
org.springframework.boot
spring-boot-starter-web
复制代码

第三步:application.properties 增加swagger配置

#开启swagger服务swagger.enable=true复制代码

第四步:使用注解配置Swagger

@Configuration@EnableSwagger2public class Swagger2Config {    public static final String BASE_PACKAGE = "com.itunion";    @Value("${swagger.enable}")    private boolean enableSwagger;    @Bean    public Docket createRestApi() {        return new Docket(DocumentationType.SWAGGER_2)                .apiInfo(apiInfo())                // 生产环境的时候关闭 swagger 比较安全                .enable(enableSwagger)                //将Timestamp类型全部转为Long类型                .directModelSubstitute(Timestamp.class, Long.class)                //将Date类型全部转为Long类型                .directModelSubstitute(Date.class, Long.class)                .select()                // 扫描接口的包路径,不要忘记改成自己的                .apis(RequestHandlerSelectors.basePackage(BASE_PACKAGE))                .paths(PathSelectors.any())                .build();    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder()            .title("Swagger RESTful APIs")            .description("Swagger API 服务")            .termsOfServiceUrl("http://swagger.io/")            .contact(new Contact("Swagger", "127.0.0.1", "zhenghhgz@163.com"))            .version("1.0")            .build();    }}复制代码

备注

  • 正常项目上线后应该是关闭掉 swagger 的,所以这边增加了一个配置 enableSwagger
  • 可以使用 directModelSubstitute 做一些期望的类型转换

第五步:创建用户实体类UserInfo

public class UserInfo {    @ApiModelProperty("编号")    private Long id;    @ApiModelProperty("用户名")    private String userName;    @ApiModelProperty("姓")    private String firstName;    @ApiModelProperty("名")    private String lastName;    @ApiModelProperty("邮箱")    private String email;    @ApiModelProperty(hidden = true)// 密码不传输    @JsonIgnore    private String password;    @ApiModelProperty("状态")    private Integer userStatus;   /**此处省略get、set **/ }复制代码

第六步:编写一个首页的Controller

@Api(value = "首页", description = "首页")@RequestMapping("/")@RestControllerpublic class IndexController {    @ApiOperation(value = "Hello Spring Boot", notes = "Hello Spring Boot")    @RequestMapping(value = "/", method = RequestMethod.GET)    public String index() {        return "Hello Spring Boot";    }    @ApiOperation(value = "API 页面", notes = "接口列表")    @RequestMapping(value = "/api", method = RequestMethod.GET)    public void api(HttpServletResponse response) throws IOException {        response.sendRedirect("swagger-ui.html");    }}复制代码
  • 为了方便访问swagger ui 页面,我们做了一个重定向 api 更方便些

第七步:编写一个登陆的Controller

@Api(value = "用户", description = "用户")@RequestMapping("/userInfo")@RestControllerpublic class UserInfoController {    @ApiOperation(value = "登录接口-多值传值方式", notes = "输入用户名和密码登录")    @ApiResponses(value = {            @ApiResponse(code = 200, message = "OK", response = UserInfo.class, responseContainer = "userInfo"),            @ApiResponse(code = 405, message = "账号名或密码错误")    })    @ApiImplicitParam(name = "map", value = "{\"userName\":\"JackMa\",\"passWord\":\"123\"}")    @RequestMapping(value = "loginForMap", method = RequestMethod.POST, produces= MediaType.APPLICATION_JSON_UTF8_VALUE)    ResponseEntity
loginForMap(@RequestBody Map
map) { if (!map.get("userName").equalsIgnoreCase("JackMa") || !map.get("passWord").equalsIgnoreCase("123")) { return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build(); } UserInfo user = new UserInfo(); user.setId(1L); user.setUserName("JackMa"); user.setFirstName("马"); user.setLastName("云"); user.setEmail("zhenghhgz@163.com"); user.setUserStatus(1); return ResponseEntity.ok(user); } @ApiOperation(value = "登录接口-多值传输方式", notes = "输入用户名和密码登录") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = UserInfo.class, responseContainer = "userInfo"), @ApiResponse(code = 405, message = "账号名或密码错误") }) @ApiImplicitParams({ @ApiImplicitParam(name = "userName",value = "用户名", required = true, dataType = "string", paramType = "query"), @ApiImplicitParam(name = "passWord",value = "密码", required = true, dataType = "string",paramType = "query"), }) @RequestMapping(value = "loginForParams", method = RequestMethod.POST, produces= MediaType.APPLICATION_JSON_UTF8_VALUE) ResponseEntity
loginForMap(@RequestParam String userName, @RequestParam String passWord) { if (!userName.equalsIgnoreCase("JackMa") || !passWord.equalsIgnoreCase("123")) { return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build(); } UserInfo user = new UserInfo(); user.setId(1L); user.setUserName("JackMa"); user.setFirstName("马"); user.setLastName("云"); user.setEmail("jackma@163.com"); user.setUserStatus(1); return ResponseEntity.ok(user); }}复制代码

备注

  • 使用Params和Param 实现了两种不同的数据传输方式
  • 建议使用Spring的 ResponseEntity 类做统一的返回结果
  • swagger 对 response code 的支持还算好,我们可以把可能出现的异常代码都一一罗列出来,方便对接的时候对异常的处理

第八步:启动运行

http://127.0.0.1:8081/api复制代码

备注

  • 端口号已自己配置为准

如下图所示:

第九步:执行

贡献者

更多精彩内容可以关注“IT实战联盟”公众号哦~~~

转载于:https://juejin.im/post/5b920faf5188255c5b5c16fa

你可能感兴趣的文章
一张图搞定OAuth2.0
查看>>
Docker相关知识整理
查看>>
Django 中间件
查看>>
js spin 加载动画(loading)
查看>>
【poj解题】3664
查看>>
linux 加固措施
查看>>
OpenStack简单测试性能监控数据记录
查看>>
AngularJS中的依赖注入
查看>>
1202 子序列个数(DP)
查看>>
深入理解移动开发的模板复用机制
查看>>
HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用
查看>>
八进制
查看>>
Memcached FAQ
查看>>
数据库事务的4大特性与隔离级别
查看>>
RobotStudio软件的Smart组件应用
查看>>
arguments.callee 属性 递归调用 & caller和callee的区别
查看>>
LeetCode 309. Best Time to Buy and Sell Stock with Cooldown
查看>>
mysql数据库知识
查看>>
struts2核心配置之Action
查看>>
Windows7 无法启动
查看>>