• Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)


    一:Swagger介绍

    Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目

    实现了与SpingMVC框架的无缝集成功能,方便生成spring restful风格的接口文档,

    同时swagger-ui还可以测试spring restful风格的接口功能。

     
     
    二:Swagger与Spring MVC集成步骤
     
    1.Maven关键配置
    1. <dependency>  
    2.             <groupId>com.mangofactory</groupId>  
    3.             <artifactId>swagger-springmvc</artifactId>  
    4.             <version>1.0.2</version>  
    5.         </dependency>  
    6.   
    7.  <dependency>  
    8.         <groupId>org.springframework</groupId>  
    9.         <artifactId>spring-webmvc</artifactId>  
    10.         <version>4.1.6.RELEASE</version>  
    11.       </dependency>  
     
     
    2. 插件配置
       CustomJavaPluginConfig
     
    3.复制swagger的相关js等静态资源到webapp目录。
       swagger-ui.js之类的。
       我copy过一次,但是有问题,最后从网上下载了一个项目,可以直接用的那种。
       然后自己再逐步改造。
     
    4.启动项目
     
     
    三、常见swagger注解一览与使用
    最常用的5个注解

    @Api:修饰整个类,描述Controller的作用

    @ApiOperation:描述一个类的一个方法,或者说一个接口

    @ApiParam:单个参数描述

     

    @ApiModel:用对象来接收参数

    @ApiProperty:用对象接收参数时,描述对象的一个字段

     

    其它若干

     

    @ApiResponse:HTTP响应其中1个描述

    @ApiResponses:HTTP响应整体描述


     

    @ApiClass

    @ApiError

    @ApiErrors


     

    @ApiParamImplicit

    @ApiParamsImplicit

     

    四、关键代码和实际例子
        例子1:
       
    1. @ApiOperation(value = "获得用户列表", notes = "列表信息", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)  
    2.     @ResponseBody  
    3.     @RequestMapping(value = "list", method = RequestMethod.POST)  
    4.     public Result<User> list(  
    5.             @ApiParam(value = "分类ID", required = true) @RequestParam Long categoryId,  
    6.             @ApiParam(value = "token", required = true) @RequestParam String token) {  
    7.         Result<User> result = new Result<User>();  
    8.         User user = new User();  
    9.         result.setData(user);  
    10.         return result;  
    11.     }  

     
     
       @ApiParam(value = "token", required = true) @RequestParam String token
    Web前端/移动端HTTP请求方式:直接把参数附带到URL后面,或者用AJAX方法,表单提交。
     
      例子2:
     
     
    1. @ApiOperation(value = "update用户", notes = ")", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)  
    2.   @ResponseBody  
    3.   @RequestMapping(value = "update", method = RequestMethod.GET/*,produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE*/)  
    4.   public Result<String> update(User user) {  
    5.       String u = findUser(user);  
    6.       System.out.println(u);  
    7.       return null;  
    8.   }  
     
     
     当参数太多的时候,需要定义太多的参数,排版看起来很不舒服。
    这个时候,可以使用对象来接收。
    @ApiModel(value = "用户对象",description="user2") 
    public class User extends CommonParam{
     
    }
    Web前端/移动端HTTP请求方式:直接把参数附带到URL后面,或者用AJAX方法,表单提交。
    这里面存在一个小问题,当后端用对象User来接收参数的时候,Swagger自带的工具是这样的:
     
    这种形式,并不是表单提交,或者把参数附加到URL的后面。
    我们只能手动构造URL,附带参数去提交。
    如果需要测试的话!
     
    例子3:
     
    1. public Result<String> add(@RequestBody User user) {  
    2.     String u = findUser(user);  
    3.     System.out.println(u);  
    4.     return null;  
    5. }  

     
     
    Web前端/移动端HTTP请求方式:必须把参数,放到request请求的body中去。
    后端不能直接用request.getParam("token")这种。
     
    获得request body中的数据,手动转换成目标数据。
        String charReader(HttpServletRequest request) throws IOException {
     
            BufferedReader br = request.getReader();
     
            String str, wholeStr = "";
            while ((str = br.readLine()) != null) {
                wholeStr += str;
            }
            return wholeStr;
     
        }
     
    个人推荐
    1.参数不多的时候,用例子1,用@ApiParam注解生成文档。
      swagger可视化界面,可以直接设置参数,发送请求来测试
    2.参数比较多的时候,用例子2,用对象来接收参数,在对象里针对每个字段,@ApiModelProperty注解生成文档。
       swagger可视化界面,可以直接设置参数,但是无法接收到。
      因此,推荐使用其它HTTP请求或POST模拟工具,发送请求,模拟测试。
     
    不推荐例子3,不通用,局限性比较大。
     
     
    五、若干截图
     
     
    六、源代码
     
    1. package cn.fansunion.swagger.serverapi.controller;  
    2.   
    3. import org.springframework.http.MediaType;  
    4. import org.springframework.stereotype.Controller;  
    5. import org.springframework.web.bind.annotation.RequestBody;  
    6. import org.springframework.web.bind.annotation.RequestMapping;  
    7. import org.springframework.web.bind.annotation.RequestMethod;  
    8. import org.springframework.web.bind.annotation.RequestParam;  
    9. import org.springframework.web.bind.annotation.ResponseBody;  
    10.   
    11. import com.wordnik.swagger.annotations.Api;  
    12. import com.wordnik.swagger.annotations.ApiOperation;  
    13. import com.wordnik.swagger.annotations.ApiParam;  
    14.   
    15. /** 
    16.  * 小雷FansUnion-一个有创业和投资经验的资深程序员-全球最大中文IT社区CSDN知名博主-排名第119 
    17.  * 博客:http://blog.csdn.net/fansunion 
    18.  * 
    19.  */  
    20. @Api(value = "user", description = "用户管理", produces = MediaType.APPLICATION_JSON_VALUE)  
    21. @Controller  
    22. @RequestMapping("user")  
    23. public class UserController {  
    24.   
    25.     // 列出某个类目的所有规格  
    26.     @ApiOperation(value = "获得用户列表", notes = "列表信息", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)  
    27.     @ResponseBody  
    28.     @RequestMapping(value = "list", method = RequestMethod.POST)  
    29.     public Result<User> list(  
    30.             @ApiParam(value = "分类ID", required = true) @RequestParam Long categoryId,  
    31.             @ApiParam(value = "分类ID", required = true) @RequestParam Long categoryId2,  
    32.             @ApiParam(value = "token", required = true) @RequestParam String token) {  
    33.         Result<User> result = new Result<User>();  
    34.         User user = new User();  
    35.         result.setData(user);  
    36.         return result;  
    37.     }  
    38.   
    39.     @ApiOperation(value = "添加用户", notes = "获取商品信息(用于数据同步)", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)  
    40.     @ResponseBody  
    41.     @RequestMapping(value = "add", method = RequestMethod.POST)  
    42.     // @RequestBody只能有1个  
    43.     // 使用了@RequestBody,不能在拦截器中,获得流中的数据,再json转换,拦截器中,也不清楚数据的类型,无法转换成java对象  
    44.     // 只能手动调用方法  
    45.     public Result<String> add(@RequestBody User user) {  
    46.         String u = findUser(user);  
    47.         System.out.println(u);  
    48.         return null;  
    49.     }  
    50.   
    51.     @ApiOperation(value = "update用户", notes = "获取商品信息(用于数据同步)", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)  
    52.     @ResponseBody  
    53.     @RequestMapping(value = "update", method = RequestMethod.GET)  
    54.     public Result<String> update(User user) {  
    55.         String u = findUser(user);  
    56.         System.out.println(u);  
    57.         return null;  
    58.     }  
    59.   
    60.     private String findUser(User user) {  
    61.         String token = user.getToken();  
    62.         return token;  
    63.     }  
    64. }  


     
    1. package cn.fansunion.swagger.serverapi.controller;  
    2.   
    3. import com.wordnik.swagger.annotations.ApiModel;  
    4. import com.wordnik.swagger.annotations.ApiModelProperty;  
    5.   
    6. /** 
    7.  * 小雷FansUnion-一个有创业和投资经验的资深程序员-全球最大中文IT社区CSDN知名博主-排名第119 
    8.  * 博客:http://blog.csdn.net/fansunion 
    9.  * 
    10.  */  
    11. @ApiModel(value = "用户对象", description = "user2")  
    12. public class User extends CommonParam {  
    13.   
    14.     @ApiModelProperty(value = "商品信息", required = true)  
    15.     private String name;  
    16.     @ApiModelProperty(value = "密码", required = true)  
    17.     private String password;  
    18.   
    19.     @ApiModelProperty(value = "性别")  
    20.     private Integer sex;  
    21.     @ApiModelProperty(value = "密码", required = true)  
    22.     private String token;  
    23.   
    24.     public String getToken() {  
    25.         return token;  
    26.     }  
    27.   
    28.     public void setToken(String token) {  
    29.         this.token = token;  
    30.     }  
    31.   
    32.     public String getName() {  
    33.         return name;  
    34.     }  
    35.   
    36.     public void setName(String name) {  
    37.         this.name = name;  
    38.     }  
    39.   
    40.     public String getPassword() {  
    41.         return password;  
    42.     }  
    43.   
    44.     public void setPassword(String password) {  
    45.         this.password = password;  
    46.     }  
    47.   
    48.     public Integer getSex() {  
    49.         return sex;  
    50.     }  
    51.   
    52.     public void setSex(Integer sex) {  
    53.         this.sex = sex;  
    54.     }  
    55.   
    56. }  
    1. package cn.fansunion.swagger.serverapi.swagger;  
    2.   
    3. import org.springframework.beans.factory.annotation.Autowired;  
    4. import org.springframework.context.annotation.Bean;  
    5. import org.springframework.context.annotation.Configuration;  
    6. import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;  
    7. import org.springframework.web.servlet.config.annotation.EnableWebMvc;  
    8. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  
    9.   
    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. @Configuration  
    17. @EnableWebMvc  
    18. @EnableSwagger  
    19. public class CustomJavaPluginConfig extends WebMvcConfigurerAdapter {  
    20.   
    21.     private SpringSwaggerConfig springSwaggerConfig;  
    22.   
    23.     @Autowired  
    24.     public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {  
    25.         this.springSwaggerConfig = springSwaggerConfig;  
    26.     }  
    27.   
    28.     /** 
    29.      * 链式编程 来定制API样式 后续会加上分组信息 
    30.      *  
    31.      * @return 
    32.      */  
    33.     @Bean  
    34.     public SwaggerSpringMvcPlugin customImplementation() {  
    35.         return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)  
    36.                 .apiInfo(apiInfo()).includePatterns(".*")  
    37.                 .useDefaultResponseMessages(false)  
    38.             //  .pathProvider(new GtPaths())  
    39.                 .apiVersion("0.1").swaggerGroup("user");  
    40.   
    41.     }  
    42.   
    43.     private ApiInfo apiInfo() {  
    44.         ApiInfo apiInfo = new ApiInfo("小雷移动端API接口平台",  
    45.                 "提供详细的后台所有Restful接口", "http://blog.csdn.net/FansUnion",  
    46.                 "FansUnion@qq.com", "小雷博客", "http://blog.csdn.net/FansUnion");  
    47.         return apiInfo;  
    48.     }  
    49.   
    50.     @Override  
    51.     public void configureDefaultServletHandling(  
    52.             DefaultServletHandlerConfigurer configurer) {  
    53.         configurer.enable();  
    54.     }  
    55.   
    56.     class GtPaths extends SwaggerPathProvider {  
    57.   
    58.         @Override  
    59.         protected String applicationPath() {  
    60.             return "/restapi";  
    61.         }  
    62.   
    63.         @Override  
    64.         protected String getDocumentationPath() {  
    65.             return "/restapi";  
    66.         }  
    67.     }  
    68.   
    69. }  
     
  • 相关阅读:
    Docker,用任何工具链和任何语言来构建任何应用
    从Docker在Linux和Windows下的区别简单理解Docker的层次结构
    Docker在Windows下的安装以及Hello World
    (译)学习如何构建自动化、跨浏览器的JavaScript单元测试
    由Python的super()函数想到的
    PS:蓝天白云的制作
    PS:缝线颜色随着鞋帮颜色的改变发生改变.files
    Windows8 64位运行Silverlight程序不能访问WCF的解决方案
    背景图片之background的用法
    12306订票助手更新
  • 原文地址:https://www.cnblogs.com/MaxElephant/p/8145007.html
Copyright © 2020-2023  润新知