beizili

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、简介
一般我们在对接前后端的时候,都需要提供相应的接口文档。对于后端来说,编写接口文档即费时费力,还会经常因为没有及时更新,导致前端对接时出现实际接口与文档不一致。而且手写接口文档还容易出错,而swagger很好的解决了这个痛点。

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。可用于:1.接口的文档在线自动生成、2.功能测试。

二、使用
1.maven导入Swagger

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>${swagger.version}</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>${swagger.version}</version>
</dependency>

2.创建Swagger2配置类

/**
 * Copyright (c) 2018 王牌后台 All rights reserved.
 *
 * https://www.wangpai.io
 *
 * 版权所有,侵权必究!
 */

package io.wangpai.common.config;

import io.wangpai.common.constant.Constant;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

/**
 * Swagger配置
 *
 * @author Mark sunlightcs@gmail.com
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig{

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            //加了ApiOperation注解的类,生成接口文档
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            //包下的类,生成接口文档
            //.apis(RequestHandlerSelectors.basePackage("io.wangpai.modules.job.controller"))
            .paths(PathSelectors.any())
            .build()
            .directModelSubstitute(java.util.Date.class, String.class)
            .securitySchemes(security());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("王牌Api")
            .description("wangpai-admin文档")
            .termsOfServiceUrl("https://www.wgame.io")
            .version("2.0.0")
            .build();
    }

    private List<ApiKey> security() {
        return newArrayList(
            new ApiKey(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER, "header")
        );
    }
}

docket() 方法创建Docket的Bean对象,apiInfo()则是创建ApiInfo的基本信息。

3.注解说明

@Api : 用在类上,说明该类的主要作用。

@ApiOperation:用在方法上,给API增加方法说明。

@ApiImplicitParams : 用在方法上,包含一组参数说明。

@ApiImplicitParam:用来注解来给方法入参增加说明。

@ApiResponses:用于表示一组响应。

@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息

@ApiModel:用在返回对象类上,描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)

@ApiModelProperty:描述一个model的属性

例子:

package io.wangpai.modules.ace.controller;

import io.wangpai.common.annotation.DataFilter;
import io.wangpai.common.annotation.LogOperation;
import io.wangpai.common.constant.Constant;
import io.wangpai.common.page.PageData;
import io.wangpai.common.utils.ExcelUtils;
import io.wangpai.common.utils.Result;
import io.wangpai.common.validator.AssertUtils;
import io.wangpai.common.validator.ValidatorUtils;
import io.wangpai.common.validator.group.AddGroup;
import io.wangpai.common.validator.group.DefaultGroup;
import io.wangpai.common.validator.group.UpdateGroup;
import io.wangpai.modules.ace.dto.AppVersionDTO;
import io.wangpai.modules.ace.excel.AppVersionExcel;
import io.wangpai.modules.ace.service.AppVersionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.wangpai.modules.sys.dto.SysDeptDTO;
import io.wangpai.modules.sys.service.SysDeptService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;


/**
 * 版本表
 */
@RestController
@RequestMapping("ace/appversion")
@Api(tags="版本表")
public class AppVersionController {
    @Autowired
    private AppVersionService appVersionService;
    @Autowired
    private SysDeptService sysDeptService;

    @GetMapping("page")
    @ApiOperation("分页")
    @ApiImplicitParams({
        @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
        @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
        @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
        @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String")
    })
    @RequiresPermissions("ace:appversion:page")
    @DataFilter
    public Result<PageData<AppVersionDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
        PageData<AppVersionDTO> page = appVersionService.page(params);
        page.getList().forEach(dto -> {
            SysDeptDTO sysDeptDTO= sysDeptService.get(dto.getDeptId());
            if(sysDeptDTO!=null) {
                dto.setDeptName(sysDeptDTO.getName());
            }
        });
        return new Result<PageData<AppVersionDTO>>().ok(page);
    }

    @GetMapping("{id}")
    @ApiOperation("信息")
    @RequiresPermissions("ace:appversion:info")
    public Result<AppVersionDTO> get(@PathVariable("id") Long id){
        AppVersionDTO data = appVersionService.get(id);
        SysDeptDTO sysDeptDTO= sysDeptService.get(data.getDeptId());
        data.setDeptName(sysDeptDTO.getName());
        return new Result<AppVersionDTO>().ok(data);
    }

    @PostMapping
    @ApiOperation("保存")
    @LogOperation("保存")
    @RequiresPermissions("ace:appversion:save")
    public Result save(@RequestBody AppVersionDTO dto){
        //效验数据
        ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);

        appVersionService.save(dto);

        return new Result();
    }

    @PutMapping
    @ApiOperation("修改")
    @LogOperation("修改")
    @RequiresPermissions("ace:appversion:update")
    public Result update(@RequestBody AppVersionDTO dto){
        //效验数据
        ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);

        appVersionService.update(dto);

        return new Result();
    }

    @DeleteMapping
    @ApiOperation("删除")
    @LogOperation("删除")
    @RequiresPermissions("ace:appversion:delete")
    public Result delete(@RequestBody Long[] ids){
        //效验数据
        AssertUtils.isArrayEmpty(ids, "id");

        appVersionService.delete(ids);

        return new Result();
    }

    @GetMapping("export")
    @ApiOperation("导出")
    @LogOperation("导出")
    @RequiresPermissions("ace:appversion:export")
    public void export(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception {
        List<AppVersionDTO> list = appVersionService.list(params);

        ExcelUtils.exportExcelToTarget(response, null, list, AppVersionExcel.class);
    }

}

4.测试登录 localhost:8080/swagger-ui.html
在这里插入图片描述

API 操作测试,修改

在这里插入图片描述
更多内容请关注微信公众号“外里科技
在这里插入图片描述

在这里插入图片描述

posted on 2020-08-02 23:30  被子里  阅读(20)  评论(0)    收藏  举报  来源