zoukankan      html  css  js  c++  java
  • SpringBoot 整合 Swagger2 以及 Swagger2 常用使用

    手写Api文档的几个痛点:

    1. 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时。
    2. 接口返回结果不明确
    3. 不能直接在线测试接口,通常需要使用工具,比如postman
    4. 接口文档太多,不好管理

    Swagger也就是为了解决这个问题,当然也不能说Swagger就一定是完美的,当然也有缺点,最明显的就是代码移入性比较强。

    这里讲解的是SpringBoot整合Swagger2,直接生成接口文档的方式。

    一、依赖

     1 <!-- swagger2  start-->
     2         <dependency>
     3             <groupId>io.springfox</groupId>
     4             <artifactId>springfox-swagger2</artifactId>
     5             <version>2.6.1</version>
     6         </dependency>
     7         <dependency>
     8             <groupId>io.springfox</groupId>
     9             <artifactId>springfox-swagger-ui</artifactId>
    10             <version>2.6.1</version>
    11         </dependency>
    12         <!--swagger-ui-layer-->
    13         <dependency>
    14             <groupId>com.github.xiaoymin</groupId>
    15             <artifactId>swagger-bootstrap-ui</artifactId>
    16             <version>1.9.1</version>
    17         </dependency>
    18   <!-- swagger2  end-->


    二、Swagger配置类

     特别要注意的是里面配置了api文件也就是controller包的路径,不然生成的文档扫描不到接口。

     1 import io.swagger.annotations.ApiOperation;
     2 
     3 import org.springframework.context.annotation.Bean;
     4 import org.springframework.context.annotation.Configuration;
     5 
     6 import springfox.documentation.builders.ApiInfoBuilder;
     7 import springfox.documentation.builders.PathSelectors;
     8 import springfox.documentation.builders.RequestHandlerSelectors;
     9 import springfox.documentation.service.ApiInfo;
    10 import springfox.documentation.spi.DocumentationType;
    11 import springfox.documentation.spring.web.plugins.Docket;
    12 import springfox.documentation.service.Tag;
    13 
    14 /**
    15  * @author Swgger2
    16  * @ClassName Swgger2
    17  * @Description
    18  * @date 2017-07-10 22:12:31
    19  */
    20 @Configuration
    21 public class Swagger2 {
    22 
    23     @Bean
    24     public Docket createRestApi() {
    25         return new Docket(DocumentationType.SWAGGER_2)
    26                 .apiInfo(apiInfo())
    27                 .tags(new Tag("order", "订单模块"),getTags())
    28                 .select()
    29                 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
    30                 .paths(PathSelectors.any())
    31                 .build();
    32     }
    33     
    34     private ApiInfo apiInfo() {
    35         return new ApiInfoBuilder()
    36                 .title("springboot利用swagger构建api文档")
    37                 .description("简单优雅的restfun风格,http://127.0.0.1:8080/myweb/swagger-ui.html")
    38                 .termsOfServiceUrl("http://127.0.0.1:8080/myweb/swagger-ui.html")
    39                 .version("1.0")
    40                 .build();
    41     }
    42 
    43     private Tag[] getTags() {
    44         Tag[] tags = {
    45                 new Tag("address", "地址"),new Tag("customer", "商户")
    46         };
    47         return tags;
    48     }
    49 }
    
    

    三、开启Swagger

    Application.class 加上注解@EnableSwagger2 表示开启Swagger
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @SpringBootApplication
    @EnableSwagger2
    public class SpringbootSwagger2Application {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringbootSwagger2Application.class, args);
    	}
    }



    访问
    地址

    http://127.0.0.1:8080/app/swagger-ui.html
    http://127.0.0.1:8080/app/doc.html
     

    四、常规用法

    头部展示方法:

    @Controller
    @RequestMapping("order")
    @Api(tags={"order"})
    public class orderController {

    }

    示例1:

    /**
    * 登录 - 获取用户
    * @return
    */
    @ApiOperation(value="用户登陆", httpMethod = "POST" ,notes="登陆,输入用户名,密码")
    @ApiImplicitParams({
    @ApiImplicitParam(paramType = "query",name = "username", value = "用户名", required = true, dataType = "String"),
    @ApiImplicitParam(paramType = "query",name = "password", value = "密码", required = true, dataType = "String")
    })
    @RequestMapping(value="/login",method= RequestMethod.POST)
    @ResponseBody
    public String login(HttpServletRequest request ,String username,String  password) {
      RetObj retObj = new RetObj();
      retObj.setFlag(false);
      try {
        String password = Base64.getFromBASE64(user.getPassword());
        user.setPassword(CryptUtils.byte2hex(CryptUtils.encrypt(LOGIN_KEY,password.getBytes("UTF-8"))));
        ShopTaskUser userInfo = userService.getUserInfo(user);
        if(userInfo != null) {
        request.getSession().setAttribute("shopTaskUserModel", userInfo);
        retObj.setFlag(true);
        logger.info(userInfo.getUsername() + "登录成功!");
      }
      } catch (Exception e) {
        e.printStackTrace();
      }
      return JSON.toJSONString(retObj);
    }

    示例2:

    @ApiOperation(value = "查询发票信息",httpMethod = "POST", notes = "根据税号查询极速开票的发票信息")
    @ApiImplicitParam(paramType = "query",name = "taxnum", value = "企业税号", required = true, dataType = "String")
    @RequestMapping(value = "/queryInvoiceInfo.do")
    @ResponseBody
    public String queryInvoiceInfo(String taxnum){
      if (CommonUtil.isBlank(taxnum)) {
        return JSON.toJSONString(CommonUtil.returnMap(JFReturnEnum.PARAM_MISSING,null));
      }
      log.info("ValetOrderController queryInvoiceInfo参数taxnum:"+taxnum);
      InvoiceVO invoiceVO = valetOrderService.queryInvoiceInfo(taxnum);
      return JSON.toJSONString(CommonUtil.returnMap(JFReturnEnum.SUCCESS,invoiceVO));
    }

    示例3:

    @ApiOperation(value = "保存收货信息",httpMethod = "POST", notes = "保存收货信息")
    // @ApiImplicitParam(name = "receivingInfoVO", value = "收货地址信息", required = true, dataType = "ReceivingInfoVO")
    @RequestMapping(value = "/saveReceivingInfo.do")
    @ResponseBody
    public String saveReceivingInfo(ReceivingInfoVO receivingInfoVO) {
      log.info("ValetOrderController saveReceivingInfo参数receivingInfoVO:"+JSON.toJSONString(receivingInfoVO));
      boolean updateRes = valetOrderService.saveReceivingInfo(receivingInfoVO);
      if(!updateRes) {
        return JSON.toJSONString(CommonUtil.returnMap(JFReturnEnum.FAIL,null));
      }
      return JSON.toJSONString(CommonUtil.returnMap(JFReturnEnum.SUCCESS,null));
    }

    public class ReceivingInfoVO {
      @ApiModelProperty(value = "订单号",required = true)
      private String orderNo;
      @ApiModelProperty(value = "收货人名称")
      private String consigneeName;
      @ApiModelProperty(value = "收货人手机号")
      private String consigneePhone;
      @ApiModelProperty(value = "收货地址所在区域+详细地址")
      private String adress;
      .........

    }

    五、Swagger注解

    swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。

    • @Api:修饰整个类,描述Controller的作用
    • @ApiOperation:描述一个类的一个方法,或者说一个接口
    • @ApiParam:单个参数描述
    • @ApiModel:用对象来接收参数
    • @ApiProperty:用对象接收参数时,描述对象的一个字段
    • @ApiResponse:HTTP响应其中1个描述
    • @ApiResponses:HTTP响应整体描述
    • @ApiIgnore:使用该注解忽略这个API
    • @ApiError :发生错误返回的信息
    • @ApiImplicitParam:一个请求参数
    • @ApiImplicitParams:多个请求参数
  • 相关阅读:
    在 kylin-v10环境中搭建 electron
    二叉树建树
    python 从txt文件中提取数据保存到 xlxs 文件中
    openpyxl 插件写入数据
    python时间格式转换
    vue-typescript-element-template使用总结
    vue3入门
    typescript入门
    记录下谷歌 浏览器请求数据时遇302,重新连接的问题
    uni使用render.js视图层与逻辑层传数据 的问题
  • 原文地址:https://www.cnblogs.com/xiexy/p/8336955.html
Copyright © 2011-2022 走看看