概述

OpenAPI 3.0 规范由 8 个根对象组成:

  1. openapi
  2. info
  3. servers
  4. paths
  5. components
  6. security
  7. tags
  8. externalDocs

OpenAPI 的其余功能都是基于这 8 根对象扩展而成,凡是包含以上对象并且扩展名为 jsonyaml 的文件,我们可以将其视为符合 OpenAPI 规范的描述文件 ,你可以在:API Editor 在线编辑器 中来验证你的 OpenAPI 文件是否符合规范,以下我们就主要介绍 8 个根对象的使用和扩展方法

openapi 对象

openapi 是最简单也是最基础的属性,我们为 OpenAPI 添加第一个根对象属性,指定使用的规范版本:

openapi: "3.0.2"

然后继续补充信息

openapi: "3.0.2"
info:
title: openAPI Demo
version: '1.0'
paths: {}

一个极简的 OpenAPI 文件就诞生了,它的展示方式如下:

  • 上面灰色的 1.0 是指你 server 的版本
  • OAS3 指的是你所使用的 OpenAPI 规范的版本

info 对象

根节点的 info 对象主要包含以下信息:

  • title: 标题
  • description: API 描述
  • version:版本号
  • license:许可证信息
  • contact:联系人信息
  • terms of service:服务条款

以下是 info 对象和属性的示例:

openapi: "3.0.2"
info:
title: openAPI Demo
description: "This is an API program for teaching"
version: '1.1'
termsOfService: "https://openweathermap.org/terms"
contact:
name: "api developer"
url: "http://myblog.cn"
email: "youemai@gmail.com"
license:
name: "Apache 2.0"
url: "http://springdoc.org"
paths: {}

以上内容的预览效果如下:

如果觉得 description 太过简陋,它也支持 Markdown 语法显示,效果如下:

按照约定 description 应该向用户展示如下信息:

  • 描述整个 API 和如何使用它
  • 为用户提供测试账号和数据
  • 其他任何用户需要的信息都可以通过它来提供

servers 对象

servers 主要表示访问服务端的基础路径,既在访问接口前都会带上该参数,示例如下:

servers:
- url: 'http://localhost:8080/webapi'

servers 对象支持多参数配置,你可以指定多服务器(开发,测试,生成等)的 URL,用户可以从下拉框选择不用服务器的 URL 发起请求,配置和预览效果如下:

servers:
- url: https://localhost:8080/webapi
description: develop server
- url: http://test-server:8080/webapi
description: test server
- url: http://product-server:8080/webapi
description: product server

paths 对象

paths 对象包含真正的 API 信息内容,它的每个项都包含一个可操作的 endpoint 操作对象,每个操作对象都包含我们常见的 GET/POST/PUT/DELETE 等方法,看一个简单示例:

paths:
/pet:
get:

以上信息描述一个 /petendpoint ,它只包含一个 get 操作对象,类似 get 操作对象(也称 Operation Objects)也包含以下属性:

  • tags:用于对 endpoint 进行分组的组名
  • summary:操作对象的摘要信息,最好限制在 5-10 字以内,主要作为概览展示
  • description:操作对象的描述信息,尽可能的详细,展示细节信息
  • operationId:操作对象的唯一 ID
  • parameters:该端点的请求参数对象,描述如下,( requestBody 描述不在此列包含系列属)
    • name:参数名称
    • in:参数出现的位置,通常是 headerpathquerycookie
    • description:参数的描述(支持 markdown)
    • required:必填项
    • deprecated:是否弃用
    • allowEmptyValue:允许提交空值
    • style:参数序列化方式
    • explode:与数组相关的参数
    • schema:参数的模型
    • example:媒体类型的示例
  • requestBody:请求主体的描述,还可以包含一个指向 components$ref 指针
  • response:响应主体的描述,通常使用标准的 HTTP 状态码,可以包含指向 components$ref 指针
  • callbacks:回调对象和回调信息的描述,较为少见,不过多介绍
  • deprecated:标识该 path 是否被弃用
  • security:仅用于覆盖全局的安全授权方法
  • servers:仅用于覆盖全局的服务器访问对象

大多数情况下不需要声明那么多的属性,以下是一个端点的 operation object 常见描述信息,如下:

paths:
/weather:
get:
tags:
summary:
description:
operationId:
externalDocs:
parameters:
responses:

parameters 对象

parameters 的示例用法(包含一个参数的 get 方法):

paths:
/weather:
get:
tags:
- Current Weather Data
summary: "Call current weather data for one location."
description: "^_^"
operationId: CurrentWeatherData
parameters:
- name: q
in: query
description: "^_^"
schema:
type: string

responses 对象

responses 用于描述接口的响应对象,可以直接描述,如下:

responses:
200:
description: Successful response
content:
application/json:
schema:
title: Sample
type: object
properties:
placeholder:
type: string
description: Placeholder description 404:
description: Not found response
content:
text/plain:
schema:
title: Weather not found
type: string
example: Not found

你可以在 Swagger UI 中看到以下的示例效果:

components 对象

components 中主要可以定义重复使用的对象,以便其他对象使用 $ref 关键字直接引用和声明

在 parameters 中重用对象

我们可以把刚才对 parameters 的描述移动到 components 中来,如下:

components:
parameters:
q:
name: q
in: query
description: "………………"
schema:
type: string
id:
name: id
in: query
description: "…………"
schema:
type: string
lat:
name: lat
in: query
description: "………………"
schema:
type: string

然后我们可以在 paramters 中直接引用它,如下:

paths:
/weather:
get:
tags:
- Current Weather Data
summary: "………………"
description: "………………."
operationId: CurrentWeatherData
parameters:
- $ref: '#/components/parameters/q'
- $ref: '#/components/parameters/id'
- $ref: '#/components/parameters/lat'
responses:
200:
description: Successful response
content:
application/json:
schema:
title: Sample
type: object
properties:
placeholder:
type: string
description: Placeholder description
404:
description: Not found response
content:
text/plain:
schema:
title: Weather not found
type: string
example: Not found

如上,利用好 components 就可以达到组件复用 +减少篇幅的效果

在 reponses 中重用对象

我们也可以直接在 reponses 中引用已经声明的对象,如下:

responses:
200:
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/200'

它在 yaml 中的描述如下:

components:
schemas:
200:
title: Successful response
type: object
properties:
base:
type: string
description: Internal parameter
example: cmc stations
visibility:
type: integer
description: Visibility, meter
example: 16093
dt:
type: integer
description: Time of data calculation, unix, UTC
format: int32
example: 1435658272
id:
type: integer
description: City ID
format: int32
example: 2172797
name:
type: string
example: Cairns
cod:
type: integer
description: Internal parameter
format: int32
example: 200

它在 Swagger UI 中展示效果如下:

在 schemas 中展示

通过 components 定义的对象都会在 Swagger UI 下方通过 Schemas 进行展示,如下:

security 对象

除了部分 Demo 示例外,大部分的 Web 服务都是需要经过身份认证的才能访问,security 就是用于描述 API 的安全信息和访问授权协议等信息的对象,OpenAPI 支持最常见的四种授权方案,如下:

  • API key
  • HTTP
  • OAuth 2.0
  • Open ID Connect

这里我们使用最常见的 API Key 作为演示,在 OpenAPI 文档的根目录添加安全对象:

security:
- app_id: []

这样所有的路径都会使用 security 描述的 app_id 安全方法,但是通常会在 components 中添加 security 对象,这样的描述信息会更加的详细,如下:

components:
...
securitySchemes:
app_id:
type: apiKey
description: API key to authorize requests.
name: appid
in: query

security 对象的属性内容:

  • type:授权协议,枚举值有:apiKeyhttpoauth2openIdConnect
  • description:安全方法的描述,尽可能的详细,包含使用示例
  • name:安全密钥 apiKey 在 HTTP Header 请求中的名字
  • in:安全密钥 apiKey 在 HTTP 传输中的位置,枚举值有:queryheadercookie
  • …………

在添加以上的描述信息后,Swagger UI 会显示安全任何的相关标识,如下:

点击 Authorize 会显示更多的安全信息:

当你在 Value 输入你的访问秘钥时,Swagger 会在访问 API 的时候,根据你的设定访问你的 API,如下:

tags 对象

该对象主要是对 OpenAPI 中的多个访问路径进行分组,从而更方面的查看 API 信息,使用示例如下:

我们为一个请求路径添加 tags 信息:

paths:
/pets:
get:
summary: List all pets
operationId: listPets
tags:
- pets

这表示该请求路径属于 pets 分组,然后我们在根目录级别添加 tags 属性,来为分组信息进行描述:

tags:
- name: pets
description: "Chimelong Animal Happy World"

然后我们来看看 Swagger UI 对于分组信息的展示,如下:

externalDocs 对象

该对象不常用,主要添加对外部文档的引用,来对目前文档进行补充,例如你可以在根目录添加该属性,如下:

externalDocs:
description: externalDocs API Documentation
url: https://openweathermap.org/api

它会在你 Swagger 的描述中展示一个链接地址,如下:

你还可以在 API 的请求路径中,增加一个外部引用的描述,如下:

paths:
/pets:
get:
summary: List all pets
externalDocs:
description: externalDocs API Documentation
url: https://openweathermap.org/api

Swagger UI 会在请求路径的描述中,增加一个外部链接作为对描述的补充,如下:

总结

以上就是一个完整的 OpenAPI 规范的文件的使用说明

参考资料:

OpenAPI 3.0 规范-食用指南的更多相关文章

  1. 拥抱 OpenAPI 3:springdoc-openapi 食用指南

    概述 使用 springdoc-openapi 可以快速为 springboot 项目生成规范的 API 文档,具体使用步骤如下: 依赖配置 在 pom.xml 加入内容,即可开始使用: <de ...

  2. BPMN 2.0规范

    .1. BPMN 2.0是什么呢? 业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解.这个标准 是由对象管理组( ...

  3. ORM框架--GreenDao 3.0基本使用指南

    0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...

  4. ffuf 基础食用指南

    PS: 1. 下文出现的某些字典 有可能是因为摆出效果 我自己瞎搞得字典 2. 分享一些好的工具 3. 其实Wfuzz也很好用的 4. 很早之前就在语雀写过Wfuzz和ffuf的笔记 但是一直没有公开 ...

  5. activiti5/6 系列之--Activiti与BPMN2.0规范相关节点对应关系

    根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subproce ...

  6. Activiti工作流与BPMN2.0规范

    本章内容根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subp ...

  7. OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

           OpenGL ES和OpenGL的图标 关于“OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out”这个问题,做一阐述: 1.关键字的小修 ...

  8. Servlet 3.0 规范(二)注解驱动和异步请求

    Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...

  9. RSS介绍、RSS 2.0规范说明和示例代码

    RSS是一种消息来源格式规范,用以发布经常更新资料的网站,例如博客.新闻的网摘.RSS文件,又称做摘要.网摘.更新.频道等,包含了全文或节选文字,再加上一定的属性数据.RSS让发布者自动发布信息,也使 ...

随机推荐

  1. linux权限问题,chmod命令

    Linux系统中,每个用户的角色和权限划分的很细致也很严格,每个文件(目录)都设有访问许可权限,利用这种机制来决定某个用户通过某种方式对文件(目录)进行读.写.执行等操作. 操作文件或目录的用户,有3 ...

  2. Typora基本使用语法(超好用的代码编辑工具)

    Typora代码编辑软件,一款适合新手小白的做笔记工具,操作简单,大家可以去试试......

  3. Hyperledger Fabric无系统通道启动及通道的创建和删除

    前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织,但目前为止,我们启动 orderer 节点的方式都是通过系统通道的方式,这样自带系 ...

  4. DDT数据驱动性能测试(一)

    DDT数据驱动性能测试(一) 一.csv数据文件设置 1.使用场景:测试过程中需要使用手机号码等大量数据时,用random函数随机生成数字:也可以使用Excel拖动生成一批手机号,也有可以从数据库中导 ...

  5. Matlab学习笔记 绘图

    1.二维曲线(1)plot函数①plot函数的基本用法:plot(x,y),其中x和y分别用于存储x坐标和y坐标数据. >>x=[1,2,3]; >>y=[4,5,6]; &g ...

  6. Oracle查看表空间大小

    遇到报错 java.sql.SQLException: ORA-01653: 表 MESHIS.HIS_RET_LOT_FQC 无法通过 8 (在表空间 MESHIS_DATA_TBS 中) 扩展 a ...

  7. ThinkPHP信息泄露

    昨天遇到了一个ThinkPHP日志泄露,然后我就写了个脚本利用shodan搜索批量的来找一下漏洞,估计已经被人撸完了,不过还有一些网站有着此漏洞.ip收集和漏洞验证脚本工具我会放在最下面,需要的直接复 ...

  8. 【Hadoop】10、Flume组件

    目录 Flume组件安装配置 1.下载和解压 Flume 2.Flume 组件部署 3.使用 Flume 发送和接受信息 Flume组件安装配置 1.下载和解压 Flume # 传Flume安装包 [ ...

  9. .NET混合开发解决方案16 管理WebView2的用户数据

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  10. Vulnhub-earth

    1.信息收集 1.1找到目标主机ip vulnhub靶场通用的技巧 这里我们靶场是nat模式的 所以肯定就是在我们自己设置的一个网段范围内,我这里nat本机的地址是10.1.1.1 所处的网段就是10 ...