Swagger

介绍

在工作时,编写玩代码以后,我们还要写一个接口文档,提供给前端或者需要调用这个接口的人看,但是手写文档实在是太费事了,所以就出现了Swgger框架,可以实现调用restFul风格的web服务,自动生成接口文档,还可以在线测试接口 

使用步骤

原生的Swager被国人集成到了Spring Boot红中了,所以只需导入启动Swagger依赖

第一步:

<!-- swagger对springboot的集成 -->
<dependency>
  <groupId>com.spring4all</groupId>
  <artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.0.RELEASE</version>

第二步:
  在配置文件中配置wagger

server:
  port: 8080    #应用的端口号
  servlet:
    context-path: /swagger  #设置根路径为  swagger

#   Spring Boot   集成swagger配置
swagger:
  enabled: true  # 开启swagger
  base-package: com.itcast.swagger.controller   # 需要生成接口文档的类所在的包
  title: "测试工程"   # 文档标题
  description: "测试swagger  这是描述"    # 文档描述
  version: 1.0   # 文档的版本号

然后启动就行,这里也看到了有一个


base-package: com.itcast.swagger.controller # 需要生成接口文档的类所在的包


swagger就会去这个包中把里面的类生成文档。

运行结果:

springboot如何集成yapi_java

注意事项 

@Controller:  swagger只会对标有@Controller注解或者他的派生类生成文档,也就是即使base-package扫描到了但是没有@Controller注解或者他的派生类依然生成不了文档

@RequestMapping:     swagger只会对有@RequestMapping生成文档

@RequestParam:这个注解接收的是例如  localhost:8080/stu?num=3      在swagger中这个名称是  问号传参     可视化界面为:query

@PathVariable: 这儿参数接受的是RestFul风格的请求,在swagger中叫 path请求   例如       localhost:8080/3     可视化界面为:path

@RequestBody:是接收的请求体中的请求  也叫 请求体传参    可视化界面为:body

 swagger注解开发

在我们上边的代码中,只能看到传参信息,但是并没有表示请求,但是我们可以通过swagger文档注解来说明文档的具体信息

常用注解:

@Api()用于类;
描述这个类是swagger的资源
@ApiOperation()用于方法;
描述一个http请求的操作
@ApiParam()用于方法,参数,字段说明;
描述参数的添加元数据(说明或是否必填等)
@ApiModel()用于类
表示对类进行说明,用于参数用实体类接收
@ApiModelProperty()用于方法,字段
表示对model属性的说明或者数据操作更改
@ApiIgnore()用于类,方法,方法参数
表示这个方法或者类被忽略
@ApiImplicitParam() 用于方法
表示单独的请求参数
@ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam

代码示例

 如果把注解都弄到controller会有点不太舒服看着,因为既要加SpringMVC的注解又要加Swagger的,所以这时候就可以创建一个接口让Controller实现这个接口,然后在接口中把这些方法都添加swagger的注解说明,这样就完成了SpringMVC和swagger都区分开了

接口的代码

@Api(tags = "Hello Api 服务测试", description = "对Hello Api 服务提供接口")
public interface HelloApi {

    @ApiOperation("测试Hello方法")
    String hello();

    @ApiOperation("测试modifyStudentNum方法")
    @ApiImplicitParam(name = "numtest参数", value = "numtest参数解释", required = true, dataType = "string", paramType = "问号请求也叫query请求")
        //上边的required = true表示是否必须传的参数,true为必须
    Student modifyStudentNum(String numtest);

    @ApiOperation("测试mmodifyStudentName方法")
    @ApiImplicitParam(name = "name参数", value = "name参数解释", required = true, dataType = "string", paramType = "路径请求也叫path请求")
    Student modifyStudentName(String name);

    @ApiOperation("测试modifyStudent方法")
        //因为它传的是实体类所以要在实体类中添加注解
    Student modifyStudent(Student student);

    @ApiOperation("测试mofidyStudentBynNum综合方法")
    //因为这里参数很多所以需要使用@ApiImplicitParams({})  如果单个参数就是用@ApiImplicitParam()
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id参数", value = "id参数解释", required = true, dataType = "string", paramType = "路径请求也叫path请求"),
            @ApiImplicitParam(name = "name参数", value = "name参数解释", required = true, dataType = "string", paramType = "问号请求也叫query请求")
    })
    //因为它传的是实体类所以要在实体类中添加注解
    Student mofidyStudentBynNum(String id, String name, Student student);
}

 controller的代码

@RestController
@RequestMapping("stu")
public class HelloController implements HelloApi {
    /**
     * 测试无参数接口地址
       无参:get  http://ip:port/rootPath/stu/hello
     */
    @Override
    @GetMapping("hello")
    public String hello() {
        return "hello";
    }
    /**
     * 测试 queryString 风格的参入参数
       QueryString(问号传参):
       get	http://ip:port/rootPath/stu?num=xxx
     */
    @Override
    @GetMapping
    public Student modifyStudentNum(@RequestParam("num") String numtest) {
        Student student = new Student(numtest, "xiaohong", 10, "parts");
        return student;
    }
    /**
     * 测试Restful风格的参入参数
       path(Restful):
       get	http://ip:port/rootPath/stu/xxxx
     */
    @Override
    @GetMapping("{name}")
    public Student modifyStudentName(@PathVariable("name") String name) {
        Student student = new Student("002", name, 10, "parts");
        return student;
    }
    /**
     * 测试json格式的传入参数
       请求体传参(json格式的数据):
       	post http://ip:port/rootPath/stu
       	requestBody:
        {
        	"xxxxx":"xxxx"
        }
     */
    @Override
    @PostMapping
    public Student modifyStudent(@RequestBody Student student) {
        student.setName("modifyName");
        return student;
    }
    /**
     * 测试 queryString 、Restful 和 json 格式的参数
       put	http://ip:port/rootPath/stu/xxxx?name=xxx
       	requestBody:
        {
        	"xxxxx":"xxxx"
        }
     */
    @Override
    @PutMapping("{id}")
    public Student mofidyStudentBynNum(@PathVariable("id") String id, @RequestParam("name") String name, @RequestBody Student student) {
        student.setName(name);
        student.setStuNo(id);
        return student;
    }
}

 实体类

@Data
@AllArgsConstructor
@ApiModel(value = "学员实体类  value",description = "对学员实体类进行描述  description")
public class Student {
    //学员编号
    @ApiModelProperty("学院编号")
    private String stuNo;
    //学成名称
    @ApiModelProperty("学院名称")
    private String name;
    //学员年龄
    @ApiModelProperty("学院年龄")
    private int age;
    //学员地址
    @ApiModelProperty("学院地址")
    private String address;

    //getter/setter 省略
}

 结果

springboot如何集成yapi_实体类_02

 

Linux安装YApi 

 但是这个swapper需要代码运行起来才能使用,所以我们需要使用一个Yapi可以理解为将swapper中的接口文档持久化,当swapper打开以后将swapper的接口文档信息导入到YApi,这样即使swapper关闭了我们也是可以看到这个接口文档的通过YApi

 使用步骤:

拉取镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/anoyi/yapi

 创建YApi的工作目录

 #创建目录
mkdir -p /usr/soft/yapi/config

 #进入到目录中 

cd /usr/soft/yapi/config

 YApi的配置文件config.json

{
  "port": "3000",
  "adminAccount": "admin@anoyi.com",
  "timeout":120000,
  "db": {
    "servername": "mongo",
    "DATABASE": "yapi",
    "port": 27017,
    "user": "admin",
    "pass": "anoyi",
    "authSource": "admin"
  }
}

在 上边创建的 /usr/soft/yapi/config 中执行下面命令来初始化yapi的数据库索引及管理员账号

docker run -it --rm \
  --link mongo-yapi:mongo \
  --entrypoint npm \
  --workdir /yapi/vendors \
  -v $PWD/config.json:/yapi/config.json \
  registry.cn-hangzhou.aliyuncs.com/anoyi/yapi \
  run install-server 

初始化后yapi默认的账号为: admin@anoyi.com    密码: ymfe.org

在 /usr/soft/yapi/config中执行下面命令来创建容器

docker run -d \
  --name yapi \
  --link mongo-yapi:mongo \
  --workdir /yapi/vendors \
  -p 3000:3000 \
  -v $PWD/config.json:/yapi/config.json \
  registry.cn-hangzhou.aliyuncs.com/anoyi/yapi \
  server/app.js

然后就可以访问游览器了,地址为   http://ip地址:3000 

游览器结果如下:

 

springboot如何集成yapi_springboot如何集成yapi_03

然后创建一个组再给组里创建一个项目,因为只有创建以后页面会变成下边这样

springboot如何集成yapi_开发语言_04


 

再进去swagger可视化界面进入下边这个地方

springboot如何集成yapi_ci_05

 

json

springboot如何集成yapi_springboot如何集成yapi_06

 下一步:

springboot如何集成yapi_ci_07

结果:

 

springboot如何集成yapi_springboot如何集成yapi_08