springboot-使用OpenAPI之后我再也没有写过接口文档

一 前言

这篇文章主要是带大家入门下如何使用OpenAPI, 笔者在github上找到对应得swagger项目都没找到javase得人门文章,看了下是基于JAX-RS,吐血了;

二 什么是 OpenAPI,

OpenAPI 是 一种基于Resful 风格 对 API进行格式化描述的一种规范; 允许你描述你整个项目的API,简单的讲就是一种接口文档生成的规范;包括如下几点 :

  1. 端点描述(如 GET /user , Post /user);
  2. 操作的参数,入输入参数,输出参数;
  3. 认证信息
  4. 联系信息,许可条款,声明等

OpenAPI 3.0 Specification

三 什么是 Swagger

Swagger 由多个组件组成,它是一个开源的构建工具,其作用就是以 OpenAPI 为 规范基准, 能够帮助开发人员设计,构建文档,测试接口,文档规范化,和消费掉Restful API;说白了就是 OpenAPI 的实现,能够生成接口文档,以后不用自己手写了!!! 我们可以看下其主要组件如下:

  1. Swagger Editor 是一个编辑工具,可以编辑描述API;
  2. Swagger UI 能让OpenAPI呈现出规范的可交互的API文档,以供他人查阅;
  3. Swagger Codegen 基于OpenAPI规范 能够生成客户端类库,服务端文档和存根,并且支持多语言,支持使用Docker,jar等方式运行构建;

更多组件详细看官网:swagger doc,看了官网的ylm格式基本结构晕,一堆黑的,客户体验非常不友好吐槽一下!看了github是基于JAX-RS 应用 ,不是很懂,再吐槽一下;

四 API生成

4.1 相关注释

注释 说明
@Api 标记类上,表明是资源
@ApiImplicitParam 表示API操作中的单个参数。
@ApiImplicitParams 允许多个参数列表
@ApiModel 针对实体model提供额外信息
@ApiModelProperty 添加操作数据或者model属性
@ApiOperation 描述HTTP方法,通常针对特定的路径
@ApiParam 对于操作添加额外的信息
@ApiResponse 描述一个操作的响应
@ApiResponses 允许多个参数列表,描述响应对象
@Authorization 使用在类上或者方法上,表示授权信息
@AuthorizationScope 描述 OAuth2 的授权作用域
@ResponseHeader 代表响应头的部分信息

4.2 pom.xml

<dependencies>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.22</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.22</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

4.3 swagger配置

主要是配置一些项目得基本信息,注解路径,项目主要联系人等;比较重要是@EnableSwagger2表示开启Swagger;

/**
 * @Author lsc
 * <p> swagger 配置 </p>
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        // 构建文档
        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        // 文档信息
        Docket build = docket.apiInfo(apiInfo())
                // 查询
                .select()
                // 注解包的路径
                .apis(RequestHandlerSelectors.basePackage("com.zszxz.swagger.controller"))
                // 任何路径
                .paths(PathSelectors.any())
                .build();
        return build;

    }
    /* *
     * @Author lsc
     * <p> 文档信息</p>
     * @Param []
     * @Return springfox.documentation.service.ApiInfo
     */
    private ApiInfo apiInfo() {
        // 文档对象构建器
        ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
        // 文档标题
        ApiInfo apiInfo = apiInfoBuilder.title("知识追寻者(公众号) API doc")
                // 描述信息
                .description("知识追寻者第一次操作OpenAPI!!!!!")
                // 版本号
                .version("v1")
                // 联系人
                .contact(new Contact("知识追寻者", "https://blog.csdn.net/youku1327", "[email protected]"))
                // 声明许可
                .license("知识追寻者许可")
                // 许可路径,这边是我的github
                .licenseUrl("https://github.com/zszxz")
                .build();

        return apiInfo;

    }
}

4.4 实体

/**
 * @Author lsc
 * <p> </p>
 */
@Data
@ApiModel(description = "用户知识追寻者实体")
public class ZSZXZ {

    @ApiModelProperty(value = "姓名",dataType = "String")
    private String name;
    @ApiModelProperty(value = "邮件",dataType = "String")
    private String email;
    @ApiModelProperty(value = "爱好",dataType = "String")
    private String hobby;
}

4.5 controller

/**
 * @Author lsc
 * <p> </p>
 */
@RestController
// 资源信息
@Api(value = "知识追寻者文档API")
public class SwaggerController {

    // 方法注释
    @ApiOperation(value = "获取用户")
    // 响应信息
    @ApiResponse(code = 200,message = "获取用户列表成功")
    @GetMapping("zszxz")
    public ResponseEntity getUser(){
        ZSZXZ zszxz = new ZSZXZ();
        zszxz.setName("知识追寻者");
        zszxz.setHobby("爱睡觉");
        zszxz.setEmail("不告诉你");
        return ResponseEntity.ok(zszxz);
    }

    // 方法注释
    @ApiOperation(value = "跟据用户编号获取用户")
    // 响应信息
    @ApiResponses({@ApiResponse(code = 200,message = "获取用户列表成功")
                    ,@ApiResponse(code = 204,message = "没有内容")})
    // 参数信息
    @ApiImplicitParam(name = "id", value = "用户编号", dataType = "ZSZXZ",required = true, paramType = "path")
    @GetMapping("zszxz/{id}")
    public ResponseEntity getUserById(@PathVariable Long id){
        ZSZXZ zszxz = new ZSZXZ();
        zszxz.setName("知识追寻者");
        zszxz.setHobby("爱睡觉");
        zszxz.setEmail("不告诉你");
        return ResponseEntity.ok(zszxz);
    }

    @PostMapping("zszxz")
    // 响应信息
    @ApiResponse(code = 201,message = "添加用户列表成功")
    // 方法信息
    @ApiOperation(value = "添加用户")
    public ResponseEntity addUser(@RequestBody ZSZXZ zszxz){

        System.out.println("save the user:"+zszxz);
        return ResponseEntity.ok("success save the user");
    }

    // 响应信息
    @ApiResponse(code = 200,message = "修改用户成功")
    @ApiOperation(value = "修改用户",notes = "修改用户")
    @PutMapping("zszxz/{id}")
    // 参数信息 多个参数使用注释中得内容, @RequestBody 修斯参数没必要写
    /*@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "用户编号", dataType = "Long",required = true,paramType = "path")
    ,@ApiImplicitParam(name = "user", value = "用户", dataType = "ZSZXZ",required = true, paramType = "json")})*/
    @ApiImplicitParam(name = "id", value = "用户编号", dataType = "Long",required = true,paramType = "path")
    public ResponseEntity updateUser(@PathVariable Long id ,@RequestBody ZSZXZ zszxz){

        System.out.println("update the user:"+zszxz);
        return ResponseEntity.ok("success update the user,the number is :"+id);
    }

    // 响应信息
    @ApiResponses({@ApiResponse(code = 200,message = "删除用户成功")
            ,@ApiResponse(code = 401,message = "没有权限")
            })
    @ApiOperation(value = "删除用户")
    @DeleteMapping("zszxz/{id}")
    @ApiImplicitParam(name = "id", value = "用户编号", dataType = "Long",required = true,paramType = "path")
    public ResponseEntity updateUser(@PathVariable Long id ){
        System.out.println("delete the user :"+id);
        return ResponseEntity.ok("delete the user :"+id);
    }

}

4.6 生成结果

默认路径:localhost:8080/swagger-ui.html#/

4.7 查看实体

4.8 查询接口测试

打开测试查询接口:

测试结果:

4.9 添加用户测试

由于注解时偷懒没加example,所以这边测试要自己动手写测试数据;

测试结果如下

五 结语

修改和删除就不测试了,很简单,读者自行测试;基本常用得注解使用都过了,其余得读者自行研究,总体来说使用还是很愉快,默认文档路径是可以修改得,读者自行搜索;源码请看作者博客专栏说明;

原文地址:https://www.cnblogs.com/zszxz/p/12195734.html

时间: 2024-07-29 20:45:20

springboot-使用OpenAPI之后我再也没有写过接口文档的相关文章

SpringBoot + Swagger2 自动生成API接口文档

spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端.在实际开发过程中,这些接口还要提供给开发测试进行相关的白盒测试,那么势必存在如何在多人协作中共享和及时更新API开发接口文档的问题. 假如你已经对传统的wiki文档共享方式所带来的弊端深恶痛绝,那么尝试一下Swagger2 方式,一定会让你有不一样的开发体验: 功能丰富 :支持多种注解,自动生成接

如何利用apidoc来写接口文档

在开发后台接口的过程中,肯定要提供一份api接口文档给终端.一直用word写,太丑了..怎么才能做出一份漂亮的api文档呢?找了好久发现了今天的主角-apidoc. 官网地址:http://apidocjs.com 开放API已经成为当下主流平台的一个要素,特别对于社交.电商类的平台开放API更成为了竞争力的一种.开放API文档的完整性.可阅读性往往影响着接入方是否能顺利地.快速地接入到平台,一份好的.统一的API文档也是开放平台不可或缺的要素. apidoc是通过源码中的注释来生成API文档,

写到 HTML 文档

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <meta charset="utf-8" /> <script src="jQuery/jquery-2.2.0.min.j

??怎样写具体设计文档

怎样写具体设计文档是一个非常头疼的话题,简单的说是需求文档的升华,也能够说是开发者开发程序的根据,当然根据具体设计文档的粒度进行.好的具体设计文档是需求人员和开发者之间的桥梁,只是眼下好多程序开发都是先开发后,然后为了应付审核,公司制度,文档规范,开发完毕后兴许补上该文档.假设这种方式,具体设计文档的的作用就忽略了. 在大多数软件项目中,要末不作具体设计,要么开发完毕后再补具体设计文档,质量也不容乐观,文档与系统往往不能同步,使具体设计文档全然流于形式,对工作没有起到实际的帮助. 那究竟应不应该

接口文档要如何写

一个简单的接口文档,写完给组长看后,发现漏洞百出.下面总结一下写文档需要注意事项:        封皮 封面最好是本公司规定的封面,有logo,内容标题,版本号,公司名称,文档产生日期.(错误地方在于,文档的标题要和页眉中的标题一致)        修订历史 表格形式较好些.包括,版本,修订说明,修订日期,修订人,审核时间审核人.(我错误的地方在于,表格中其他空白表格没有居中)        接口信息 接口调用方式,是post方式还是get方式,接口地址,别人需要线上的哪个地址就写哪个.(自己提

如何正确规范写接口文档

前言 正规的团队合作或者是项目对接,接口文档是非常重要的,一般接口文档都是通过开发人员写的.一个工整的文档显得是非重要.下面我将我看到的一篇接口文档做一个总结 开始吧!!! 接口1: 查询排重接口 接口详情   地址 http://www.baidu.com (正式环境) 请求方式 GET 参数 是否必填 说明 idfa 是 广告标识符,只支持单个查询 source 是 渠道来源,具体值在接入时再进行分配 返回结果 格式 JSON 状态码 10000 success(调用成功)   10001

告别手写接口文档时代,比Swagger功能更强大的LKADocument接口文档管理框架诞生了!

更详细的更全面的教程请观看作者亲自录制的视频教程,地址: https://edu.51cto.com/sd/9cb7fLKADocument视频教程 一.介绍 在前后端分离,分工更加明细化的今天,为了减少前端和后台开发人员的沟通成本,能够让他们做到并行开发,同时也能保证前端和后端开发人员所看到的接口文档的一致性,即时性,以此来大大提高工作效率.所以出现了一些非常优秀的接口管理工具,具有代表性的像Swagger,因为它能够通过注解或yml和JSON描述文件来自动生成接口文档.但是我觉得它不管是在配

顶级产品经理是如何写产品需求文档(PRD)的

产品需求文档(PRD)对每个产品经理来说都不陌生,它是产品项目由"概念化"阶段进入到"图纸化"的转折和体现,作用是"对市场需求文档(MRD)中的内容进行指标化和技术化",PRD质量的好坏直接影响到研发部门是否能够明确产品的功能和性能,是否能够研发出符合预期的产品,所以PRD也是体现产品经理专业程度的一个重要指标. 可以理解为,PRD是产品经理关于产品功能的宣导和传达,它通过清晰扼要的表述将产品意图呈现给阅读者,PRD的阅读者一般包括开发人员,设计

Springboot+swagger2的接口文档开发

一.创建一个SpringBoot项目 1. 2. 3. 4. 把web里的web选中,SQL里选择自己需要的,点击next 二.创建各项所需的controller,configure等 1. 项目布局 2. 引入的包 <!-- swagger2所用的包 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId>