swagger

Swagger框架学习分享


转至元数据结尾
转至元数据起始

一、背景介绍

1.1.项目简介

Swagger项目是由Dilip Krishnan和Adrian Kelly等人维护开发的一个为Spring Web MVC 项目提供方法文档的一个框架。该框架最主要的功能是将Controller的方法进行可视化的展现,像方法注释,方法参数,方法返回值等都提供了相应的用户界面,尤其是对JSON参数的支持。同时可以结合swagger-ui可以对用户界面进行不同程度的定制,也可以对方法进行一个简单的测试。

1.2.code repository

  • github:https://github.com/springdox/springdox
  • maven:http://www.mvnrepository.com/artifact/com.mangofactory/swagger-springmvc

1.3.演示项目

  • 官方:https://github.com/adrianbk/swagger-springmvc-demo
  • 民间:https://github.com/qq291462491/bugkillers

二、开发准备

2.1.环境准备

  • idea intellij 13+
  • Oracle java 1.6
  • Gradle 2.0 +

2.2.项目搭建

2.2.1.jar仓库

Maven

    
       jcenter-release
       jcenter
       http: //oss.jfrog.org/artifactory/oss-release-local/
    
 
     com.mangofactory
     swagger-springmvc
     1.0 . 0

Gradle

repositories {
     jcenter()
}
 
compile  "com.mangofactory:swagger-springmvc:1.0.0"

2.2.2.相关依赖

  • As of v0.9.5 all dependencies on scala have been removed.
  • Spring 3.2.x or above
  • jackson 2.4.4
  • guava 15.0

2.2.3.编写配置文件

编写一个Java文件,并使用注解:

  • @Configuration 配置注解,自动在本类上下文加载一些环境变量信息
  • @EnableWebMvc 
  • @EnableSwagger 使swagger生效
  • @ComponentScan("com.myapp.packages") 需要扫描的包路径

示例:

[java]  view plain  copy
  1. package org.bugkillers.back.swagger;  
  2.    
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.context.annotation.Bean;  
  5. import org.springframework.context.annotation.ComponentScan;  
  6. import org.springframework.context.annotation.Configuration;  
  7. import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;  
  8. import org.springframework.web.servlet.config.annotation.EnableWebMvc;  
  9. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  
  10. import com.mangofactory.swagger.configuration.SpringSwaggerConfig;  
  11. import com.mangofactory.swagger.models.dto.ApiInfo;  
  12. import com.mangofactory.swagger.paths.SwaggerPathProvider;  
  13. import com.mangofactory.swagger.plugin.EnableSwagger;  
  14. import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;  
  15. /** 
  16.  * 使用注解的方式来扫描API 
  17.  * 无需在Spring的xml配置文件来配置,由 @see @EnableWebMvc 代替 
  18.  * 

     

  19.  * 

     @author 刘新宇 

  20.  * 
  21.  * 

     @date 2015年1月30日 下午1:18:48 

  22.  * 

     @version 0.0.1 

  23.  */  
  24. @Configuration  
  25. @EnableWebMvc  
  26. @EnableSwagger  
  27. @ComponentScan(basePackages ={"com.ak.swaggerspringmvc.shared.controller""com.ak.spring3.music"})  
  28. public class CustomJavaPluginConfig extends WebMvcConfigurerAdapter {  
  29.    private SpringSwaggerConfig springSwaggerConfig;  
  30.    @Autowired  
  31.    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {  
  32.       this.springSwaggerConfig = springSwaggerConfig;  
  33.    }  
  34.    /** 
  35.     * 链式编程 来定制API样式 
  36.     * 后续会加上分组信息 
  37.     * @return 
  38.     */  
  39.    @Bean  
  40.    public SwaggerSpringMvcPlugin customImplementation(){  
  41.       return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)  
  42.             .apiInfo(apiInfo())  
  43.             .includePatterns(".*")  
  44. //            .pathProvider(new GtPaths())  
  45.             .apiVersion("0.0.1")  
  46.             .swaggerGroup("user");  
  47.    }  
  48.     private ApiInfo apiInfo() {  
  49.       ApiInfo apiInfo = new ApiInfo(  
  50.               "bugkillers-back API",  
  51.               "bugkillers 后台API文档",  
  52.               "http://127.0.0.1:9081/api" "="" style="color: rgb(59, 115, 175); text-decoration: none; border-radius: 0px !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: inherit !important; background: none !important;">http://127.0.0.1:9081/api",  
  53.               "[email protected]",  
  54.               "My License",  
  55.               "My Apps API License URL"  
  56.         );  
  57.       return apiInfo;  
  58.     }  
  59.     @Override  
  60.     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {  
  61.       configurer.enable();  
  62.     }  
  63.        
  64.     class GtPaths extends SwaggerPathProvider{  
  65.         @Override  
  66.         protected String applicationPath() {  
  67.             return "/restapi";  
  68.         }  
  69.         @Override  
  70.         protected String getDocumentationPath() {  
  71.             return "/restapi";  
  72.         }  
  73.     }  
  74.        
  75. }  

 

 也可以自己不写配置类,直接使用默认的实现类,在Spring的配置文件中共配置:(不推荐

1
2
class = "com.mangofactory.swagger.configuration.SpringSwaggerConfig"  />

 

2.2.4.与swagger-ui集成

方式一:

  • Note: Only use this option if you don't need to customize any of the swagger-ui static content, otherwise use option 2.
  • Use the web-jar which packages all of the swagger-ui static content.
  • Requires that your app is using the servlet 3 specification.
  • For non-spring boot applications some extra spring configuration (ResourceHandler's) is required. See: https://github.com/adrianbk/swagger-springmvc-demo/tree/master/swagger-ui
1
2
3
4
dependencies {
   ...
   compile  "org.ajar:swagger-spring-mvc-ui:0.4"
}

方式二:(推荐

  • Manually copy all of the static content swagger-ui's dist directory (https://github.com/wordnik/swagger-ui/tree/master/dist)
  • Provide the necessary view resolvers and resource handlers to serve the static content.
  • Consult the spring documentation on serving static resources.

The following is one way to serve static content from /src/main/webapp

1
2
3
4
5
"*.html"  location= "/" />
 
default -servlet-handler/>

2.6.5.Controller配置

使用注解对Controller进行配置:

  • @Api 配置方法API
  • @ApiOperation API的操作 GET PUT DELETE POST
  • @ApiParam API的方法参数描述

示例Controller:

[java]  view plain  copy
  1. package org.bugkillers.back.user.controller;  
  2. import java.util.List;  
  3. import org.bugkillers.back.bean.User;  
  4. import org.bugkillers.back.result.Result;  
  5. import org.bugkillers.back.user.service.UserService;  
  6. import org.bugkillers.back.util.ResultUtil;  
  7. import org.springframework.beans.factory.annotation.Autowired;  
  8. import org.springframework.http.HttpStatus;  
  9. import org.springframework.http.ResponseEntity;  
  10. import org.springframework.stereotype.Controller;  
  11. import org.springframework.web.bind.annotation.PathVariable;  
  12. import org.springframework.web.bind.annotation.RequestBody;  
  13. import org.springframework.web.bind.annotation.RequestMapping;  
  14. import org.springframework.web.bind.annotation.RequestMethod;  
  15. import org.springframework.web.bind.annotation.ResponseBody;  
  16. import com.wordnik.swagger.annotations.Api;  
  17. import com.wordnik.swagger.annotations.ApiOperation;  
  18. import com.wordnik.swagger.annotations.ApiParam;  
  19. /** 
  20.  * 用户操作Controller 
  21.  * 

     

  22.  * 

     

  23.  * 
  24.  * @author 刘新宇 
  25.  * 
  26.  *         

     

  27.  * @date 2015年1月30日 上午10:50:34 
  28.  *       

     

  29.  * @version 0.0.1 
  30.  */  
  31. @Api(value = "user-api", description = "有关于用户的CURD操作", position = 5)  
  32. @Controller  
  33. @RequestMapping("/user")  
  34. public class UserController {  
  35.     @Autowired  
  36.     private UserService service;  
  37.     /** 
  38.      * 注册用户 
  39.      * @param user 
  40.      */  
  41.     @ApiOperation(value = "注册", notes = "注册用户", position = 3)  
  42.     @ResponseBody  
  43.     @RequestMapping(value = { "/regist" }, method = RequestMethod.POST)  
  44.     public ResponseEntity regist(@RequestBody User user) {  
  45.         service.save(user);  
  46.         Result result = ResultUtil.buildSuccessResult("注册成功");  
  47.         return new ResponseEntity>(result, HttpStatus.OK);  
  48.     }  
  49.        
  50.     /** 
  51.      * 根据pk查找用户 
  52.      * @param userPk 
  53.      * @return 
  54.      */  
  55.     @ApiOperation(value = "根据pk查找用户", notes = "返回用户实体对象", response = User.class, position = 2)  
  56.     @ResponseBody  
  57.     @RequestMapping(value = { "/{userPk}" }, method = RequestMethod.GET)  
  58.     public ResponseEntity findByPk(  
  59.             @ApiParam(value = "填写Pk", allowableValues = "range[1,5]", required = true, defaultValue = "userPk", allowMultiple = true@PathVariable("userPk") Integer userPk) {  
  60.         Result result = ResultUtil.buildSuccessResult(service.findByPk(userPk));  
  61.         return new ResponseEntity>(result, HttpStatus.OK);  
  62.     }  
  63.        
  64.     /** 
  65.      * 测试 
  66.      * @param who 
  67.      * @return 
  68.      */  
  69.     @ApiOperation(value = "Hellow World", notes = "测试功能", position = 1)  
  70.     @ResponseBody  
  71.     @RequestMapping(value = { "/hello/{who}" }, method = RequestMethod.GET)  
  72.     public ResponseEntity hello(  
  73.             @ApiParam(value = "填写名称"@PathVariable("who") String who) {  
  74.         Result result = ResultUtil.buildSuccessResult( "Hello guys" + " " + who + "!");  
  75.         return new ResponseEntity>(result, HttpStatus.OK);  
  76.     }  
  77.     /** 
  78.      * 查询所有 
  79.      * @return 
  80.      */  
  81.     @ApiOperation(value = "获取所有用户", notes = "返回用户实体对象集合", position = 5)  
  82.     @RequestMapping(value = "/findAll", method = RequestMethod.GET)  
  83.     public @ResponseBody ResponseEntity  findAll() {  
  84.         Result> result = ResultUtil.buildSuccessResult( service.findAll());  
  85.         return  new ResponseEntity>>(result, HttpStatus.OK);  
  86.     }  
  87.        
  88.     /** 
  89.      * 根据用户pk更新实体 
  90.      * @param userPk  用户pk 
  91.      * @param user 返回更新后的实体 
  92.      * @return 
  93.      */  
  94.     @ApiOperation(value = "更新用户", notes = "返回更新的用户实体对象",position = 5)  
  95.     @RequestMapping(value = "/update/{userPk}", method = RequestMethod.PUT)  
  96.     public ResponseEntity updateByPk(  
  97.             @PathVariable("userPk") Integer userPk, @RequestBody User user) {  
  98.         user.setPk_user(userPk);  
  99.         service.update(user);  
  100.         Result result = ResultUtil.buildSuccessResult(user);  
  101.         return new ResponseEntity>(result, HttpStatus.OK);  
  102.     }  
  103.        
  104.     /** 
  105.      * 根据用户pk删除实体 
  106.      * @param userPk  用户pk 
  107.      * @return 
  108.      */  
  109.     @ApiOperation(value = "删除用户", notes = "根据pk删除用户",position = 5)  
  110.     @RequestMapping(value = "/delete/{userPk}", method = RequestMethod.GET)  
  111.     public ResponseEntity deleteByPk(  
  112.             @PathVariable("userPk") Integer userPk) {  
  113.         service.delete(userPk);  
  114.         Result result = ResultUtil.buildSuccessResult("删除成功");  
  115.         return new ResponseEntity>(result, HttpStatus.OK);  
  116.     }  
  117. }  


2.2.6.启动中间件

项目配置了Jetty或者Tomcat等Web容器的话,在对应的Controller配置好的话就可以启动看效果了。

  • 访问本机:http://127.0.0.1:9081/api
  • 远程示例:http://115.29.170.213/api

2.2.7.需求定制

  • 分组信息定制
  • Url定制
  • Http相应定制

 

三、学习感想

Swagger很好的为我们在开发RESTful框架应用时,前后台分离的情况下提供了很有效的解决方案,上手迅速,操作简单,界面精简,功能完善,满足各种定制化的需求,是在使用Spring MVC做Web开发时的不二选择。通过对swagger的学习,增强了英语交流的能力,改变了以前的学习方法,收获了很多,同时也也得感谢国外友人的悉心帮助~技术无国界~

3.1  Guava工具类的使用  http://ifeve.com/google-guava/

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等

3.2  Gradle构建工具的使用  http://ifeve.com/google-guava/

配置更加简洁,支持Maven,好多开源项目已经从Maven转到Gradle。

3.3  Groovy语言 http://groovy.codehaus.org/User+Guide

和scala、clojure等同是在JVM上运行的脚本语言,丰富的类库,和Java互通,可以作为Java程序员的第二语言。

3.4  链式编程 (return this

Java中类似Swagger配置文件SwaggerSpringMvcPlugin

JQuery中类似 $("#p1").css("color","red").slideUp(2000).slideDown(2000);

你可能感兴趣的:(swagger)