OpenAPI 规范 v3.0.2

版本 3.0.2

关于此文档的更多详细信息
此版本
https://spec.openapis.org.cn/oas/v3.0.2.html
最新发布版本
https://spec.openapis.org.cn/oas/latest.html
最新编辑草案
https://github.com/OAI/OpenAPI-Specification/
编辑
Darrel Miller
Jeremy Whitlock
Marsh Gardiner
Mike Ralphson
Ron Ratovsky
Uri Sarid
前任编辑
Jason Harmon
Tony Tam
参与
GitHub OAI/OpenAPI-Specification
提交错误
提交历史
拉取请求

什么是 OpenAPI 规范?

OpenAPI 规范 (OAS) 定义了一个标准的、与编程语言无关的 HTTP API 接口描述,它允许人类和计算机在无需访问源代码、其他文档或检查网络流量的情况下发现和理解服务的 capabilities。如果通过 OpenAPI 正确定义,消费者可以使用最少的实现逻辑来理解和交互远程服务。类似于接口描述在较低级别编程中的作用,OpenAPI 规范消除了调用服务的猜测。

本文档的状态

此规范的真相来源是上面引用的 HTML 文件,作为“此版本”。

1. OpenAPI 规范

1.1 版本 3.0.2

本文档中的关键词“必须”、“禁止”、“必需”、“”、“不应”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,当且仅当它们以全大写字母显示时,如本文档所示。

本文档根据Apache 许可证 2.0 版获得许可。

2. 简介

OpenAPI 规范 (OAS) 定义了一个标准的、与语言无关的 RESTful API 接口,它允许人类和计算机在无需访问源代码、文档或通过网络流量检查的情况下发现和理解服务的 capabilities。如果正确定义,消费者可以使用最少的实现逻辑来理解和交互远程服务。

然后,OpenAPI 定义可用于文档生成工具显示 API,代码生成工具生成各种编程语言中的服务器和客户端,测试工具以及许多其他用例。

3. 定义

3.1 OpenAPI 文档

定义或描述 API 的文档(或一组文档)。OpenAPI 定义使用并符合 OpenAPI 规范。

3.2 路径模板

路径模板是指使用花括号 ({}) 来标记 URL 路径的一部分,以便使用路径参数替换。

3.3 媒体类型

媒体类型定义分布在多个资源中。媒体类型定义应该符合 [RFC6838]。

一些可能的媒体类型定义示例

  text/plain; charset=utf-8
  application/json
  application/vnd.github+json
  application/vnd.github.v3+json
  application/vnd.github.v3.raw+json
  application/vnd.github.v3.text+json
  application/vnd.github.v3.html+json
  application/vnd.github.v3.full+json
  application/vnd.github.v3.diff
  application/vnd.github.v3.patch

3.4 HTTP 状态码

HTTP 状态码用于指示执行的操作的状态。可用状态码由 [RFC7231] 第 6 节 定义,注册的状态码列在IANA 状态码注册表中。

4. 规范

4.1 版本

OpenAPI 规范使用语义版本控制 2.0.0 (semver) 进行版本控制,并遵循 semver 规范。

semver 的 . 部分(例如 3.0指定 OAS 功能集。通常,.补丁 版本解决此文档中的错误,而不是功能集。支持 OAS 3.0 的工具应该与所有 OAS 3.0.* 版本兼容。工具不应考虑补丁版本,例如不区分 3.0.03.0.1

OpenAPI 规范(OpenAPI Specification)后续的次要版本发布(增加minor版本号)不应影响为较低次要版本和相同主要版本开发的工具。因此,假设的3.1.0规范应该能够与为3.0.0设计的工具一起使用。

与 OAS 3.*.* 兼容的 OpenAPI 文档包含一个必需的openapi字段,该字段指定其使用的 OAS 的语义版本。(OAS 2.0 文档包含一个名为swagger且值为"2.0"的顶层版本字段。)

4.2 格式

符合 OpenAPI 规范的 OpenAPI 文档本身就是一个 JSON 对象,可以以JSONYAML格式表示。

例如,如果一个字段具有数组值,则将使用 JSON 数组表示形式

{
   "field": [ 1, 2, 3 ]
}

规范中的所有字段名称都区分大小写。这包括用作映射中键的所有字段,除非明确指出键不区分大小写

模式公开两种类型的字段:固定字段,具有声明的名称;和模式字段,为字段名称声明正则表达式模式。

模式字段必须在包含的对象中具有唯一的名称。

为了保留在 YAML 和 JSON 格式之间进行往返的能力,YAML 1.2 版本建议与一些额外的约束一起使用

注意:虽然可以使用 YAML 或 JSON 格式的 OpenAPI 文档来定义 API,但 API 请求和响应主体以及其他内容不需要是 JSON 或 YAML。

4.3 文档结构

OpenAPI 文档可以由单个文档组成,也可以根据用户的意愿分为多个相互连接的部分。在后一种情况下,$ref字段必须用于规范中引用这些部分,如下面的JSON Schema定义所示。

建议将根 OpenAPI 文档命名为:openapi.jsonopenapi.yaml

4.4 数据类型

OAS 中的原始数据类型基于JSON Schema 规范 Wright 草稿 00支持的类型。请注意,integer作为一种类型也受支持,并且被定义为没有小数部分或指数部分的 JSON 数字。null不受支持作为类型(有关替代解决方案,请参阅nullable)。模型使用Schema 对象定义,它是 JSON Schema 规范 Wright 草稿 00 的扩展子集。

基元具有一个可选的修饰符属性:format。OAS 使用几个已知的格式来详细定义正在使用的数据类型。但是,为了支持文档需求,format属性是一个开放的string值属性,可以具有任何值。即使此规范未定义,也可以使用诸如"email""uuid"等格式。可以。没有format属性的类型遵循 JSON Schema 中的类型定义。不识别特定format的工具可以默认回退到仅使用type,就像没有指定format一样。

OAS 定义的格式为

类型 格式 注释
整数 int32 带符号的 32 位
整数 int64 带符号的 64 位(又名长整型)
数字 浮点
数字 双精度
字符串
字符串 字节 base64 编码字符
字符串 二进制 任何字节序列
布尔值
字符串 日期 full-date所定义 - [RFC3339] 第 5.6 节
字符串 日期时间 date-time所定义 - [RFC3339] 第 5.6 节
字符串 密码 提示 UI 隐藏输入。

4.5 富文本格式化

在整个规范中,description字段都被注释为支持[CommonMark] Markdown 格式。如果 OpenAPI 工具呈现富文本,则它必须至少支持[CommonMark-0.27]中描述的 Markdown 语法。工具可以选择忽略某些 CommonMark 功能以解决安全问题。

4.6 URL 中的相对引用

除非另有说明,否则所有作为 URL 的属性可以是[RFC3986] 第 4.2 节中定义的相对引用。使用Server 对象中定义的 URL 作为基本 URI 来解析相对引用。

$ref中使用的相对引用根据JSON Reference进行处理,使用当前文档的 URL 作为基本 URI。另请参阅Reference 对象

4.7 模式

在以下描述中,如果一个字段没有明确必需或使用必须或应该进行描述,则可以认为它是可选的

4.7.1 OpenAPI 对象

这是OpenAPI 文档的根文档对象。

4.7.1.1 固定字段
字段名称 类型 描述
openapi 字符串 必需。此字符串必须是OpenAPI 文档使用的语义版本号openapi字段应该由工具规范和客户端用来解释 OpenAPI 文档。这与 API info.version字符串无关。
info Info 对象 必需。提供有关 API 的元数据。元数据可以根据需要由工具使用。
servers [Server 对象] Server 对象数组,提供到目标服务器的连接信息。如果未提供servers属性或其为空数组,则默认值为Server 对象,其url值为/
paths Paths 对象 必需。API 可用的路径和操作。
components Components 对象 用于保存规范中各种模式的元素。
security [Security Requirement 对象] 声明可以在整个 API 中使用哪些安全机制。值列表包括可使用的替代安全需求对象。只需要满足安全需求对象之一即可授权请求。各个操作可以覆盖此定义。
tags [Tag 对象] 规范使用的标签列表,以及其他元数据。标签的顺序可用于反映解析工具对它们的顺序。并非Operation 对象使用的所有标签都必须声明。未声明的标签可以随机组织或根据工具的逻辑组织。列表中的每个标签名称必须唯一。
externalDocs 外部文档对象 其他外部文档。

此对象可以使用规范扩展进行扩展。

4.7.2 信息对象

该对象提供有关 API 的元数据。客户端如果需要可以使用元数据,并且为了方便起见,可以在编辑或文档生成工具中显示。

4.7.2.1 固定字段
字段名称 类型 描述
title 字符串 必需。应用程序的标题。
description 字符串 应用程序的简短描述。[CommonMark]语法可以用于富文本表示。
termsOfService 字符串 API 服务条款的 URL。必须采用 URL 格式。
contact Contact 对象 公开 API 的联系信息。
license License 对象 公开 API 的许可证信息。
version 字符串 必需。OpenAPI 文档的版本(与OpenAPI 规范版本或 API 实现版本不同)。

此对象可以使用规范扩展进行扩展。

4.7.2.2 信息对象示例
{
  "title": "Sample Pet Store App",
  "description": "This is a sample server for a pet store.",
  "termsOfService": "http://example.com/terms/",
  "contact": {
    "name": "API Support",
    "url": "http://www.example.com/support",
    "email": "[email protected]"
  },
  "license": {
    "name": "Apache 2.0",
    "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
  },
  "version": "1.0.1"
}
title: Sample Pet Store App
description: This is a sample server for a pet store.
termsOfService: http://example.com/terms/
contact:
  name: API Support
  url: http://www.example.com/support
  email: [email protected]
license:
  name: Apache 2.0
  url: https://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.1

4.7.3 联系对象

公开 API 的联系信息。

4.7.3.1 固定字段
字段名称 类型 描述
name 字符串 联系人/组织的识别名称。
url 字符串 指向联系信息的 URL。必须采用 URL 格式。
email 字符串 联系人/组织的电子邮件地址。必须采用电子邮件地址格式。

此对象可以使用规范扩展进行扩展。

4.7.3.2 联系对象示例
{
  "name": "API Support",
  "url": "http://www.example.com/support",
  "email": "[email protected]"
}
name: API Support
url: http://www.example.com/support
email: [email protected]

4.7.4 许可证对象

公开 API 的许可证信息。

4.7.4.1 固定字段
字段名称 类型 描述
name 字符串 必需。API 使用的许可证名称。
url 字符串 API 使用的许可证的 URL。必须采用 URL 格式。

此对象可以使用规范扩展进行扩展。

4.7.4.2 许可证对象示例
{
  "name": "Apache 2.0",
  "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
}
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html

4.7.5 服务器对象

表示服务器的对象。

4.7.5.1 固定字段
字段名称 类型 描述
url 字符串 必需。目标主机的 URL。此 URL 支持服务器变量,并且可以是相对的,以指示主机位置相对于提供 OpenAPI 文档的位置。当在{括号}中命名变量时,将进行变量替换。
description 字符串 一个可选字符串,描述 URL 指定的主机。[CommonMark]语法可以用于富文本表示。
variables Map[string, Server Variable 对象] 变量名称与其值之间的映射。该值用于替换服务器的 URL 模板中的值。

此对象可以使用规范扩展进行扩展。

4.7.5.2 服务器对象示例

单个服务器将被描述为

{
  "url": "https://development.gigantic-server.com/v1",
  "description": "Development server"
}
url: https://development.gigantic-server.com/v1
description: Development server

以下展示了如何描述多个服务器,例如,在 OpenAPI 对象的 servers 中。

{
  "servers": [
    {
      "url": "https://development.gigantic-server.com/v1",
      "description": "Development server"
    },
    {
      "url": "https://staging.gigantic-server.com/v1",
      "description": "Staging server"
    },
    {
      "url": "https://api.gigantic-server.com/v1",
      "description": "Production server"
    }
  ]
}
servers:
- url: https://development.gigantic-server.com/v1
  description: Development server
- url: https://staging.gigantic-server.com/v1
  description: Staging server
- url: https://api.gigantic-server.com/v1
  description: Production server

以下展示了如何在服务器配置中使用变量。

{
  "servers": [
    {
      "url": "https://{username}.gigantic-server.com:{port}/{basePath}",
      "description": "The production API server",
      "variables": {
        "username": {
          "default": "demo",
          "description": "this value is assigned by the service provider, in this example `gigantic-server.com`"
        },
        "port": {
          "enum": [
            "8443",
            "443"
          ],
          "default": "8443"
        },
        "basePath": {
          "default": "v2"
        }
      }
    }
  ]
}
servers:
- url: https://{username}.gigantic-server.com:{port}/{basePath}
  description: The production API server
  variables:
    username:
      # note! no enum here means it is an open value
      default: demo
      description: this value is assigned by the service provider, in this example `gigantic-server.com`
    port:
      enum:
        - '8443'
        - '443'
      default: '8443'
    basePath:
      # open meaning there is the opportunity to use special base paths as assigned by the provider, default is `v2`
      default: v2

4.7.6 服务器变量对象

表示用于服务器 URL 模板替换的服务器变量的对象。

4.7.6.1 固定字段
字段名称 类型 描述
枚举 [string] 如果替换选项来自有限的集合,则使用一组字符串值的枚举。
默认值 字符串 必填。用于替换的默认值,如果提供备选值,则应发送此值。请注意,此行为与Schema 对象处理默认值的方式不同,因为在这些情况下,参数值是可选的。
描述 字符串 服务器变量的可选描述。[CommonMark] 语法可以用于富文本表示。

此对象可以使用规范扩展进行扩展。

4.7.7 组件对象

保存一组可重用的对象,用于 OAS 的不同方面。除非组件对象中定义的所有对象被组件对象外部的属性显式引用,否则它们对 API 没有任何影响。

4.7.7.1 固定字段
字段名称 类型 描述
schemas Map[string, Schema 对象 | 引用对象] 用于保存可重用Schema 对象的对象。
responses Map[string, 响应对象 | 引用对象] 用于保存可重用响应对象的对象。
parameters Map[string, 参数对象 | 引用对象] 用于保存可重用参数对象的对象。
examples Map[string, 示例对象 | 引用对象] 用于保存可重用示例对象的对象。
requestBodies Map[string, 请求体对象 | 引用对象] 用于保存可重用请求体对象的对象。
headers Map[string, 头部对象 | 引用对象] 用于保存可重用头部对象的对象。
securitySchemes Map[string, 安全方案对象 | 引用对象] 用于保存可重用安全方案对象的对象。
links Map[string, 链接对象 | 引用对象] 用于保存可重用链接对象的对象。
callbacks Map[string, 回调对象 | 引用对象] 用于保存可重用回调对象的对象。

此对象可以使用规范扩展进行扩展。

上面声明的所有固定字段都是对象,这些对象必须使用与正则表达式匹配的键:^[a-zA-Z0-9\.\-_]+$

字段名称示例

User
User_1
User_Name
user-name
my.org.User
4.7.7.2 组件对象示例
"components": {
  "schemas": {
    "GeneralError": {
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "format": "int32"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "Category": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "Tag": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "format": "int64"
        },
        "name": {
          "type": "string"
        }
      }
    }
  },
  "parameters": {
    "skipParam": {
      "name": "skip",
      "in": "query",
      "description": "number of items to skip",
      "required": true,
      "schema": {
        "type": "integer",
        "format": "int32"
      }
    },
    "limitParam": {
      "name": "limit",
      "in": "query",
      "description": "max records to return",
      "required": true,
      "schema" : {
        "type": "integer",
        "format": "int32"
      }
    }
  },
  "responses": {
    "NotFound": {
      "description": "Entity not found."
    },
    "IllegalInput": {
      "description": "Illegal input for operation."
    },
    "GeneralError": {
      "description": "General Error",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/GeneralError"
          }
        }
      }
    }
  },
  "securitySchemes": {
    "api_key": {
      "type": "apiKey",
      "name": "api_key",
      "in": "header"
    },
    "petstore_auth": {
      "type": "oauth2",
      "flows": {
        "implicit": {
          "authorizationUrl": "http://example.org/api/oauth/dialog",
          "scopes": {
            "write:pets": "modify pets in your account",
            "read:pets": "read your pets"
          }
        }
      }
    }
  }
}
components:
  schemas:
    GeneralError:
      type: object
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
    Category:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
    Tag:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
  parameters:
    skipParam:
      name: skip
      in: query
      description: number of items to skip
      required: true
      schema:
        type: integer
        format: int32
    limitParam:
      name: limit
      in: query
      description: max records to return
      required: true
      schema:
        type: integer
        format: int32
  responses:
    NotFound:
      description: Entity not found.
    IllegalInput:
      description: Illegal input for operation.
    GeneralError:
      description: General Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/GeneralError'
  securitySchemes:
    api_key:
      type: apiKey
      name: api_key
      in: header
    petstore_auth:
      type: oauth2
      flows:
        implicit:
          authorizationUrl: http://example.org/api/oauth/dialog
          scopes:
            write:pets: modify pets in your account
            read:pets: read your pets

4.7.8 路径对象

保存到各个端点及其操作的相对路径。路径附加到来自Server 对象的 URL,以构建完整的 URL。由于ACL 约束,路径可以为空。

4.7.8.1 模式化字段
字段模式 类型 描述
/{path} 路径项对象 到单个端点的相对路径。字段名称必须以斜杠开头。路径被附加(无相对 URL 解析)到来自Server 对象url字段的扩展 URL,以构建完整的 URL。路径模板是允许的。在匹配 URL 时,具体(非模板化)路径将在其模板化对应部分之前匹配。具有相同层次结构但不同模板名称的模板化路径不得存在,因为它们是相同的。如果存在歧义匹配,则由工具决定使用哪一个。

此对象可以使用规范扩展进行扩展。

4.7.8.2 路径模板匹配

假设以下路径,如果使用具体定义/pets/mine,将首先匹配。

  /pets/{petId}
  /pets/mine

以下路径被认为是相同的且无效的。

  /pets/{petId}
  /pets/{name}

以下可能会导致模糊解析。

  /{entity}/me
  /books/{id}
4.7.8.3 路径对象示例
{
  "/pets": {
    "get": {
      "description": "Returns all pets from the system that the user has access to",
      "responses": {
        "200": {         
          "description": "A list of pets.",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/pet"
                }
              }
            }
          }
        }
      }
    }
  }
}
/pets:
  get:
    description: Returns all pets from the system that the user has access to
    responses:
      '200':
        description: A list of pets.
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/pet'

4.7.9 路径项对象

描述单个路径上可用的操作。由于ACL 约束,路径项可以为空。路径本身仍然暴露给文档查看器,但他们将不知道哪些操作和参数可用。

4.7.9.1 固定字段
字段名称 类型 描述
$ref 字符串 允许此路径项的外部定义。引用的结构必须采用路径项对象的格式。如果引用的定义与该路径项的定义之间存在冲突,则行为是未定义的
摘要 字符串 一个可选的字符串摘要,旨在应用于此路径中的所有操作。
描述 字符串 一个可选的字符串描述,旨在应用于此路径中的所有操作。[CommonMark] 语法可以用于富文本表示。
get 操作对象 在此路径上定义 GET 操作。
put 操作对象 在此路径上定义 PUT 操作。
post 操作对象 在此路径上定义 POST 操作。
delete 操作对象 在此路径上定义 DELETE 操作。
options 操作对象 在此路径上定义 OPTIONS 操作。
head 操作对象 在此路径上定义 HEAD 操作。
patch 操作对象 在此路径上定义 PATCH 操作。
trace 操作对象 在此路径上定义 TRACE 操作。
servers [Server 对象] 服务此路径中所有操作的备用server数组。
parameters [参数对象 | 引用对象] 适用于此路径下描述的所有操作的参数列表。这些参数可以在操作级别覆盖,但不能在那里删除。该列表不得包含重复的参数。唯一参数由名称位置的组合定义。该列表可以使用引用对象链接到在OpenAPI 对象的 components/parameters中定义的参数。

此对象可以使用规范扩展进行扩展。

4.7.9.2 路径项对象示例
{
  "get": {
    "description": "Returns pets based on ID",
    "summary": "Find pets by ID",
    "operationId": "getPetsById",
    "responses": {
      "200": {
        "description": "pet response",
        "content": {
          "*/*": {
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Pet"
              }
            }
          }
        }
      },
      "default": {
        "description": "error payload",
        "content": {
          "text/html": {
            "schema": {
              "$ref": "#/components/schemas/ErrorModel"
            }
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "description": "ID of pet to use",
      "required": true,
      "schema": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "style": "simple"
    }
  ]
}
get:
  description: Returns pets based on ID
  summary: Find pets by ID
  operationId: getPetsById
  responses:
    '200':
      description: pet response
      content:
        '*/*' :
          schema:
            type: array
            items:
              $ref: '#/components/schemas/Pet'
    default:
      description: error payload
      content:
        'text/html':
          schema:
            $ref: '#/components/schemas/ErrorModel'
parameters:
- name: id
  in: path
  description: ID of pet to use
  required: true
  schema:
    type: array
    style: simple
    items:
      type: string 

4.7.10 操作对象

描述路径上的单个 API 操作。

4.7.10.1 固定字段
字段名称 类型 描述
tags [string] 用于 API 文档控制的一组标签。标签可用于根据资源或任何其他限定符对操作进行逻辑分组。
摘要 字符串 操作执行内容的简短摘要。
描述 字符串 操作行为的详细解释。[CommonMark] 语法可以用于富文本表示。
外部文档 外部文档对象 此操作的其他外部文档。
操作ID 字符串 用于标识操作的唯一字符串。ID必须在 API 中描述的所有操作中唯一。operationId 值区分大小写。工具和库可以使用 operationId 唯一标识操作,因此,建议遵循常见的编程命名约定。
parameters [参数对象 | 引用对象] 适用于此操作的参数列表。如果参数已在路径项中定义,则新定义将覆盖它,但永远无法删除它。该列表不得包含重复的参数。唯一参数由名称位置的组合定义。该列表可以使用引用对象链接到在OpenAPI 对象的 components/parameters中定义的参数。
requestBody 请求体对象 | 引用对象 适用于此操作的请求体。requestBody仅在 HTTP 1.1 规范 [RFC7231] 第 4.3.1 节 已明确定义请求体语义的 HTTP 方法中受支持。在 HTTP 规范含糊不清的其他情况下,使用者忽略requestBody
responses 响应对象 必填。执行此操作返回的可能响应列表。
callbacks Map[string, 回调对象 | 引用对象] 与父操作相关的可能带外回调的映射。键是回调对象的唯一标识符。映射中的每个值都是一个回调对象,它描述了 API 提供者可能发起的请求以及预期的响应。用于标识回调对象的键值是一个在运行时计算的表达式,该表达式标识用于回调操作的 URL。
已弃用 布尔值 声明此操作已弃用。使用者应该避免使用已声明的操作。默认值为false
security [Security Requirement 对象] 声明哪些安全机制可用于此操作。值列表包括可使用的替代安全要求对象。只需要满足安全要求对象之一即可授权请求。此定义会覆盖任何已声明的顶级security。若要删除顶级安全声明,可以使用空数组。
servers [Server 对象] 服务此操作的备用server数组。如果在路径项对象或根级别指定了备用server对象,则此值将覆盖它。

此对象可以使用规范扩展进行扩展。

4.7.10.2 操作对象示例
{
  "tags": [
    "pet"
  ],
  "summary": "Updates a pet in the store with form data",
  "operationId": "updatePetWithForm",
  "parameters": [
    {
      "name": "petId",
      "in": "path",
      "description": "ID of pet that needs to be updated",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/x-www-form-urlencoded": {
        "schema": {
          "type": "object",
           "properties": {
              "name": {
                "description": "Updated name of the pet",
                "type": "string"
              },
              "status": {
                "description": "Updated status of the pet",
                "type": "string"
             }
           },
        "required": ["status"]
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Pet updated.",
      "content": {
        "application/json": {},
        "application/xml": {}
      }
    },
    "405": {
      "description": "Method Not Allowed",
      "content": {
        "application/json": {},
        "application/xml": {}
      }
    }
  },
  "security": [
    {
      "petstore_auth": [
        "write:pets",
        "read:pets"
      ]
    }
  ]
}
tags:
- pet
summary: Updates a pet in the store with form data
operationId: updatePetWithForm
parameters:
- name: petId
  in: path
  description: ID of pet that needs to be updated
  required: true
  schema:
    type: string
requestBody:
  content:
    'application/x-www-form-urlencoded':
      schema:
       properties:
          name:
            description: Updated name of the pet
            type: string
          status:
            description: Updated status of the pet
            type: string
       required:
         - status
responses:
  '200':
    description: Pet updated.
    content:
      'application/json': {}
      'application/xml': {}
  '405':
    description: Method Not Allowed
    content:
      'application/json': {}
      'application/xml': {}
security:
- petstore_auth:
  - write:pets
  - read:pets

4.7.11 外部文档对象

允许引用外部资源以获取扩展文档。

4.7.11.1 固定字段
字段名称 类型 描述
描述 字符串 目标文档的简短描述。[CommonMark] 语法可以用于富文本表示。
URL 字符串 必填。目标文档的 URL。值必须采用 URL 格式。

此对象可以使用规范扩展进行扩展。

4.7.11.2 外部文档对象示例
{
  "description": "Find more info here",
  "url": "https://example.com"
}
description: Find more info here
url: https://example.com

4.7.12 参数对象

描述单个操作参数。

唯一参数由名称位置的组合定义。

4.7.12.1 参数位置

in字段指定了四个可能的参数位置。

  • path - 与 路径模板 结合使用,其中参数值实际上是操作 URL 的一部分。这并不包括 API 的主机或基本路径。例如,在 /items/{itemId} 中,路径参数是 itemId
  • query - 附加到 URL 的参数。例如,在 /items?id=### 中,查询参数是 id
  • header - 预期作为请求一部分的自定义标头。请注意,[RFC7230] 第 22 页 指出标头名称不区分大小写。
  • cookie - 用于将特定的 cookie 值传递给 API。
4.7.12.2 固定字段
字段名称 类型 描述
name 字符串 必需。参数的名称。参数名称区分大小写
  • 如果 in"path",则 name 字段必须path 字段中来自 路径对象 的关联路径段相对应。有关更多信息,请参阅 路径模板
  • 如果 in"header"name 字段为 "Accept""Content-Type""Authorization",则忽略参数定义。
  • 对于所有其他情况,name 对应于 in 属性使用的参数名称。
in 字符串 必需。参数的位置。可能的值为“query”、“header”、“path”或“cookie”。
description 字符串 参数的简要描述。这可能包含使用示例。[CommonMark] 语法可以用于富文本表示。
required 布尔值 确定此参数是否为强制性参数。如果 参数位置 为“path”,则此属性为必需,其值必须true。否则,可以包含该属性,其默认值为 false
deprecated 布尔值 指定参数已弃用,并且应该停止使用。默认值为 false
allowEmptyValue 布尔值 设置传递空值参数的能力。这仅对 query 参数有效,并允许发送具有空值的参数。默认值为 false。如果使用了 style,并且如果行为为 n/a(无法序列化),则忽略 allowEmptyValue 的值。不建议使用此属性,因为它可能会在以后的版本中删除。

参数序列化的规则以两种方式之一指定。对于更简单的场景,schemastyle 可以描述参数的结构和语法。

字段名称 类型 描述
style 字符串 根据参数值的类型描述如何序列化参数值。默认值(基于 in 的值):对于 query - form;对于 path - simple;对于 header - simple;对于 cookie - form
explode 布尔值 当此值为 true 时,类型为 arrayobject 的参数值会为数组的每个值或映射的键值对生成单独的参数。对于其他类型的参数,此属性无效。当 styleform 时,默认值为 true。对于所有其他样式,默认值为 false
allowReserved 布尔值 确定参数值是否应该允许保留字符,如 [RFC3986] 第 2.2 节 :/?#[]@!$&'()*+,;= 包含在内而不进行百分比编码。此属性仅适用于 in 值为 query 的参数。默认值为 false
schema 模式对象 | 引用对象 定义用于参数的类型的模式。
example 任何 媒体类型的示例。如果存在,则示例应该与指定的模式和编码属性匹配。example 字段与 examples 字段互斥。此外,如果引用包含示例的 schema,则 example覆盖模式提供的示例。为了表示无法以 JSON 或 YAML 自然表示的媒体类型的示例,字符串值可以包含示例,并在必要时进行转义。
examples Map[ string, 示例对象 | 引用对象] 媒体类型的示例。每个示例应该包含以参数编码中指定的正确格式的值。examples 字段与 example 字段互斥。此外,如果引用包含示例的 schema,则 examples覆盖模式提供的示例。

对于更复杂的场景,content 属性可以定义参数的媒体类型和模式。参数必须包含 schema 属性或 content 属性,但不能同时包含两者。当 exampleexamplesschema 对象一起提供时,示例必须遵循参数规定的序列化策略。

字段名称 类型 描述
content Map[string, 媒体类型对象] 包含参数表示形式的映射。键是媒体类型,值描述它。映射必须仅包含一个条目。
4.7.12.3 样式值

为了支持序列化简单参数的常用方法,定义了一组 style 值。

style 类型 in 注释
matrix primitivearrayobject path 由 [RFC6570] 第 3.2.7 节 定义的路径样式参数
label primitivearrayobject path 由 [RFC6570] 第 3.2.5 节 定义的标签样式参数
form primitivearrayobject querycookie 由 [RFC6570] 第 3.2.8 节 定义的表单样式参数。此选项使用 csv(当 explode 为 false 时)或 multi(当 explode 为 true 时)值替换 OpenAPI 2.0 中的 collectionFormat
simple array pathheader 由 [RFC6570] 第 3.2.2 节 定义的简单样式参数。此选项使用 csv 值替换 OpenAPI 2.0 中的 collectionFormat
spaceDelimited array query 以空格分隔的数组值。此选项替换 OpenAPI 2.0 中等于 ssvcollectionFormat
pipeDelimited array query 以管道分隔的数组值。此选项替换 OpenAPI 2.0 中等于 pipescollectionFormat
deepObject object query 提供了一种使用表单参数呈现嵌套对象简单方法。
4.7.12.4 样式示例

假设名为 color 的参数具有以下值之一

   string -> "blue"
   array -> ["blue","black","brown"]
   object -> { "R": 100, "G": 200, "B": 150 }

下表显示了每个值的渲染差异示例。

style explode empty 字符串 array object
matrix false ;color ;color=blue ;color=blue,black,brown ;color=R,100,G,200,B,150
matrix true ;color ;color=blue ;color=blue;color=black;color=brown ;R=100;G=200;B=150
label false . .blue .blue.black.brown .R.100.G.200.B.150
label true . .blue .blue.black.brown .R=100.G=200.B=150
form false color= color=blue color=blue,black,brown color=R,100,G,200,B,150
form true color= color=blue color=blue&color=black&color=brown R=100&G=200&B=150
simple false n/a blue blue,black,brown R,100,G,200,B,150
simple true n/a blue blue,black,brown R=100,G=200,B=150
spaceDelimited false n/a n/a blue%20black%20brown R%20100%20G%20200%20B%20150
pipeDelimited false n/a n/a blue|black|brown R|100|G|200
deepObject true n/a n/a n/a color[R]=100&color[G]=200&color[B]=150

此对象可以使用规范扩展进行扩展。

4.7.12.5 参数对象示例

具有 64 位整数数组的标头参数

{
  "name": "token",
  "in": "header",
  "description": "token to be passed as a header",
  "required": true,
  "schema": {
    "type": "array",
    "items": {
      "type": "integer",
      "format": "int64"
    }
  },
  "style": "simple"
}
name: token
in: header
description: token to be passed as a header
required: true
schema:
  type: array
  items:
    type: integer
    format: int64
style: simple

字符串值的路径参数

{
  "name": "username",
  "in": "path",
  "description": "username to fetch",
  "required": true,
  "schema": {
    "type": "string"
  }
}
name: username
in: path
description: username to fetch
required: true
schema:
  type: string

字符串值的可选查询参数,通过重复查询参数允许多个值

{
  "name": "id",
  "in": "query",
  "description": "ID of the object to fetch",
  "required": false,
  "schema": {
    "type": "array",
    "items": {
      "type": "string"
    }
  },
  "style": "form",
  "explode": true
}
name: id
in: query
description: ID of the object to fetch
required: false
schema:
  type: array
  items:
    type: string
style: form
explode: true

自由格式查询参数,允许特定类型的未定义参数

{
  "in": "query",
  "name": "freeForm",
  "schema": {
    "type": "object",
    "additionalProperties": {
      "type": "integer"
    },
  },
  "style": "form"
}
in: query
name: freeForm
schema:
  type: object
  additionalProperties:
    type: integer
style: form

使用 content 定义序列化的复杂参数

{
  "in": "query",
  "name": "coordinates",
  "content": {
    "application/json": {
      "schema": {
        "type": "object",
        "required": [
          "lat",
          "long"
        ],
        "properties": {
          "lat": {
            "type": "number"
          },
          "long": {
            "type": "number"
          }
        }
      }
    }
  }
}
in: query
name: coordinates
content:
  application/json:
    schema:
      type: object
      required:
        - lat
        - long
      properties:
        lat:
          type: number
        long:
          type: number

4.7.13 请求体对象

描述单个请求正文。

4.7.13.1 固定字段
字段名称 类型 描述
description 字符串 请求正文的简要描述。这可能包含使用示例。[CommonMark] 语法可以用于富文本表示。
content Map[string, 媒体类型对象] 必需。请求正文的内容。键是媒体类型或媒体类型范围,请参阅 [RFC7231] 附录 D,值描述它。对于匹配多个键的请求,仅适用最具体的键。例如,text/plain 覆盖 text/*
required 布尔值 确定请求中是否需要请求正文。默认为 false

此对象可以使用规范扩展进行扩展。

4.7.13.2 请求体示例

具有引用模型定义的请求正文。

{
  "description": "user to add to the system",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/User"
      },
      "examples": {
          "user" : {
            "summary": "User Example",
            "externalValue": "http://foo.bar/examples/user-example.json"
          }
        }
    },
    "application/xml": {
      "schema": {
        "$ref": "#/components/schemas/User"
      },
      "examples": {
          "user" : {
            "summary": "User example in XML",
            "externalValue": "http://foo.bar/examples/user-example.xml"
          }
        }
    },
    "text/plain": {
      "examples": {
        "user" : {
            "summary": "User example in Plain text",
            "externalValue": "http://foo.bar/examples/user-example.txt"
        }
      }
    },
    "*/*": {
      "examples": {
        "user" : {
            "summary": "User example in other format",
            "externalValue": "http://foo.bar/examples/user-example.whatever"
        }
      }
    }
  }
}
description: user to add to the system
content:
  'application/json':
    schema:
      $ref: '#/components/schemas/User'
    examples:
      user:
        summary: User Example
        externalValue: 'http://foo.bar/examples/user-example.json'
  'application/xml':
    schema:
      $ref: '#/components/schemas/User'
    examples:
      user:
        summary: User Example in XML
        externalValue: 'http://foo.bar/examples/user-example.xml'
  'text/plain':
    examples:
      user:
        summary: User example in text plain format
        externalValue: 'http://foo.bar/examples/user-example.txt'
  '*/*':
    examples:
      user:
        summary: User example in other format
        externalValue: 'http://foo.bar/examples/user-example.whatever'

作为字符串值数组的正文参数

{
  "description": "user to add to the system",
  "content": {
    "text/plain": {
      "schema": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    }
  }
}
description: user to add to the system
required: true
content:
  text/plain:
    schema:
      type: array
      items:
        type: string

4.7.14 媒体类型对象

每个媒体类型对象都为其键标识的媒体类型提供模式和示例。

4.7.14.1 固定字段
字段名称 类型 描述
schema 模式对象 | 引用对象 定义请求、响应或参数内容的模式。
example 任何 媒体类型的示例。示例对象应该采用媒体类型指定的正确格式。example 字段与 examples 字段互斥。此外,如果引用包含示例的 schema,则 example覆盖模式提供的示例。
examples Map[ string, 示例对象 | 引用对象] 媒体类型的示例。每个示例对象应该与媒体类型和指定的模式(如果存在)匹配。examples 字段与 example 字段互斥。此外,如果引用包含示例的 schema,则 examples覆盖模式提供的示例。
encoding Map[string, 编码对象] 属性名称与其编码信息之间的映射。键(即属性名称)必须在模式中作为属性存在。编码对象仅在媒体类型为 multipartapplication/x-www-form-urlencoded 时应用于 requestBody 对象。

此对象可以使用规范扩展进行扩展。

4.7.14.2 媒体类型示例
{
  "application/json": {
    "schema": {
         "$ref": "#/components/schemas/Pet"
    },
    "examples": {
      "cat" : {
        "summary": "An example of a cat",
        "value":
          {
            "name": "Fluffy",
            "petType": "Cat",
            "color": "White",
            "gender": "male",
            "breed": "Persian"
          }
      },
      "dog": {
        "summary": "An example of a dog with a cat's name",
        "value" :  {
          "name": "Puma",
          "petType": "Dog",
          "color": "Black",
          "gender": "Female",
          "breed": "Mixed"
        },
      "frog": {
          "$ref": "#/components/examples/frog-example"
        }
      }
    }
  }
}
application/json:
  schema:
    $ref: "#/components/schemas/Pet"
  examples:
    cat:
      summary: An example of a cat
      value:
        name: Fluffy
        petType: Cat
        color: White
        gender: male
        breed: Persian
    dog:
      summary: An example of a dog with a cat's name
      value:
        name: Puma
        petType: Dog
        color: Black
        gender: Female
        breed: Mixed
    frog:
      $ref: "#/components/examples/frog-example"
4.7.14.3 文件上传注意事项

与 2.0 规范相比,OpenAPI 中的 file 输入/输出内容使用与任何其他模式类型相同的语义进行描述。具体来说

# content transferred with base64 encoding
schema:
  type: string
  format: base64
# content transferred in binary (octet-stream):
schema:
  type: string
  format: binary

这些示例适用于文件上传的输入有效负载或响应有效负载。

用于在 POST 操作中提交文件的 requestBody 可能如下例所示

requestBody:
  content:
    application/octet-stream:
      # any media type is accepted, functionally equivalent to `*/*`
      schema:
        # a binary file of any type
        type: string
        format: binary

此外,可以指定特定的媒体类型MAY

# multiple, specific media types may be specified:
requestBody:
  content:
      # a binary file of type png or jpeg
    'image/jpeg':
      schema:
        type: string
        format: binary
    'image/png':
      schema:
        type: string
        format: binary       

要上传多个文件,必须使用multipart媒体类型。

requestBody:
  content:
    multipart/form-data:
      schema:
        properties:
          # The property name 'file' will be used for all files.
          file:
            type: array
            items:
              type: string
              format: binary

4.7.14.4 对 x-www-form-urlencoded 请求体的支持

要使用[RFC1866]通过表单 URL 编码提交内容,可以使用以下定义

requestBody:
  content:
    application/x-www-form-urlencoded:
      schema:
        type: object
        properties:
          id:
            type: string
            format: uuid
          address:
            # complex types are stringified to support RFC 1866
            type: object
            properties: {}

在此示例中,当传递到服务器时,requestBody中的内容必须根据[RFC1866]进行字符串化。此外,address字段的复杂对象也将被字符串化。

当在application/x-www-form-urlencoded内容类型中传递复杂对象时,此类属性的默认序列化策略在Encoding Objectstyle属性中描述为form

4.7.14.5 multipart 内容的特殊注意事项

multipart/form-data用作将请求主体传输到操作时的Content-Type很常见。与 2.0 相比,当使用multipart内容时,需要一个schema来定义操作的输入参数。这支持复杂结构以及支持多种文件上传的机制。

当传递multipart类型时,可以使用边界来分隔正在传输的内容部分——因此,为multipart定义了以下默认Content-Type

  • 如果属性是基本类型,或基本类型的数组,则默认 Content-Type 为text/plain
  • 如果属性是复杂类型,或复杂类型的数组,则默认 Content-Type 为application/json
  • 如果属性是type: stringformat: binaryformat: base64(也称为文件对象),则默认 Content-Type 为application/octet-stream

示例

requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          id:
            type: string
            format: uuid
          address:
            # default Content-Type for objects is `application/json`
            type: object
            properties: {}
          profileImage:
            # default Content-Type for string/binary is `application/octet-stream`
            type: string
            format: binary
          children:
            # default Content-Type for arrays is based on the `inner` type (text/plain here)
            type: array
            items:
              type: string
          addresses:
            # default Content-Type for arrays is based on the `inner` type (object shown, so `application/json` in this example)
            type: array
            items:
              type: '#/components/schemas/Address'

引入encoding属性以控制multipart请求主体部分的序列化。此属性适用于multipartapplication/x-www-form-urlencoded请求主体。

4.7.15 编码对象

应用于单个模式属性的单个编码定义。

4.7.15.1 固定字段
字段名称 类型 描述
contentType 字符串 用于编码特定属性的 Content-Type。默认值取决于属性类型:对于formatbinarystringapplication/octet-stream;对于其他基本类型 – text/plain;对于object - application/json;对于array – 默认值根据内部类型定义。该值可以是特定的媒体类型(例如application/json),通配符媒体类型(例如image/*),或这两种类型的逗号分隔列表。
headers Map[string, 头部对象 | 引用对象] 允许提供其他信息作为标头的映射,例如Content-DispositionContent-Type单独描述,并且在此部分中忽略。如果请求主体媒体类型不是multipart,则此属性被忽略。
style 字符串 根据其类型描述特定属性值将如何序列化。有关Parameter Objectstyle属性的详细信息,请参见。行为遵循与query参数相同的值,包括默认值。如果请求主体媒体类型不是application/x-www-form-urlencoded,则此属性被忽略。
explode 布尔值 如果此值为 true,则类型为arrayobject的属性值会为数组的每个值或映射的键值对生成单独的参数。对于其他类型的属性,此属性无效。当styleform时,默认值为true。对于所有其他样式,默认值为false。如果请求主体媒体类型不是application/x-www-form-urlencoded,则此属性被忽略。
allowReserved 布尔值 确定参数值是否应该允许保留字符,如[RFC3986] 第 2.2 节:/?#[]@!$&'()*+,;=包含在内而不进行百分比编码。默认值为false。如果请求主体媒体类型不是application/x-www-form-urlencoded,则此属性被忽略。

此对象可以使用规范扩展进行扩展。

4.7.15.2 编码对象示例
requestBody:
  content:
    multipart/mixed:
      schema:
        type: object
        properties:
          id:
            # default is text/plain
            type: string
            format: uuid
          address:
            # default is application/json
            type: object
            properties: {}
          historyMetadata:
            # need to declare XML format!
            description: metadata in XML format
            type: object
            properties: {}
          profileImage:
            # default is application/octet-stream, need to declare an image type only!
            type: string
            format: binary
      encoding:
        historyMetadata:
          # require XML Content-Type in utf-8 encoding
          contentType: application/xml; charset=utf-8
        profileImage:
          # only accept png/jpeg
          contentType: image/png, image/jpeg
          headers:
            X-Rate-Limit-Limit:
              description: The number of allowed requests in the current period
              schema:
                type: integer

4.7.16 响应对象

操作预期响应的容器。该容器将 HTTP 响应代码映射到预期响应。

文档不一定需要涵盖所有可能的 HTTP 响应代码,因为它们可能事先未知。但是,文档应涵盖成功操作响应和任何已知错误。

default可以用作规范中未单独涵盖的所有 HTTP 代码的默认响应对象。

Responses Object必须包含至少一个响应代码,并且应该是成功操作调用的响应。

4.7.16.1 固定字段
字段名称 类型 描述
default Response Object | Reference Object 除为特定 HTTP 响应代码声明的响应之外的响应文档。使用此字段来涵盖未声明的响应。Reference Object可以链接到OpenAPI Object’s components/responses部分定义的响应。
4.7.16.2 模式化字段
字段模式 类型 描述
HTTP 状态代码 Response Object | Reference Object 任何HTTP 状态代码都可以用作属性名称,但每个代码只有一个属性,以描述该 HTTP 状态代码的预期响应。Reference Object可以链接到OpenAPI Object’s components/responses部分中定义的响应。为了在 JSON 和 YAML 之间保持兼容性,此字段必须用引号括起来(例如,“200”)。要定义一系列响应代码,此字段可以包含大写通配符X。例如,2XX表示[200-299]之间的所有响应代码。仅允许以下范围定义:1XX2XX3XX4XX5XX。如果使用显式代码定义响应,则该显式代码定义优先于该代码的范围定义。

此对象可以使用规范扩展进行扩展。

4.7.16.3 响应对象示例

成功操作的 200 响应和其他响应(暗示错误)的默认响应

{
  "200": {
    "description": "a pet to be returned",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Pet"
        }
      }
    }
  },
  "default": {
    "description": "Unexpected error",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/ErrorModel"
        }
      }
    }
  }
}
'200':
  description: a pet to be returned
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/Pet'
default:
  description: Unexpected error
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/ErrorModel'

4.7.17 响应对象

描述来自 API 操作的单个响应,包括基于响应的操作的设计时静态links

4.7.17.1 固定字段
字段名称 类型 描述
description 字符串 必需。响应的简短描述。[CommonMark]语法可以用于富文本表示。
headers Map[string, 头部对象 | 引用对象] 将标头名称映射到其定义。[RFC7230] 第 22 页指出标头名称不区分大小写。如果使用名称"Content-Type"定义响应标头,则忽略它。
content Map[string, 媒体类型对象] 包含潜在响应有效负载描述的映射。键是媒体类型或媒体类型范围,请参见[RFC7231] 附录 D,并且值描述了它。对于匹配多个键的响应,仅适用最具体的键。例如,text/plain 覆盖 text/*
links Map[string, 链接对象 | 引用对象] 可以从响应中跟随的操作链接的映射。映射的键是链接的简称,遵循Component Objects名称的命名约束。

此对象可以使用规范扩展进行扩展。

4.7.17.2 响应对象示例

复杂类型数组的响应

{
  "description": "A complex object array response",
  "content": {
    "application/json": {
      "schema": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/VeryComplexType"
        }
      }
    }
  }
}
description: A complex object array response
content:
  application/json:
    schema:
      type: array
      items:
        $ref: '#/components/schemas/VeryComplexType'

带有字符串类型的响应

{
  "description": "A simple string response",
  "content": {
    "text/plain": {
      "schema": {
        "type": "string"
      }
    }
  }

}
description: A simple string response
content:
  text/plain:
    schema:
      type: string

带有标头的纯文本响应

{
  "description": "A simple string response",
  "content": {
    "text/plain": {
      "schema": {
        "type": "string"
      }
    }
  },
  "headers": {
    "X-Rate-Limit-Limit": {
      "description": "The number of allowed requests in the current period",
      "schema": {
        "type": "integer"
      }
    },
    "X-Rate-Limit-Remaining": {
      "description": "The number of remaining requests in the current period",
      "schema": {
        "type": "integer"
      }
    },
    "X-Rate-Limit-Reset": {
      "description": "The number of seconds left in the current period",
      "schema": {
        "type": "integer"
      }
    }
  }
}
description: A simple string response
content:
  text/plain:
    schema:
      type: string
    example: 'whoa!'
headers:
  X-Rate-Limit-Limit:
    description: The number of allowed requests in the current period
    schema:
      type: integer
  X-Rate-Limit-Remaining:
    description: The number of remaining requests in the current period
    schema:
      type: integer
  X-Rate-Limit-Reset:
    description: The number of seconds left in the current period
    schema:
      type: integer

没有返回值的响应

{
  "description": "object created"
}
description: object created

4.7.18 回调对象

与父操作相关的可能的带外回调的映射。映射中的每个值都是一个Path Item Object,它描述了一组可能由 API 提供程序发起的请求和预期的响应。用于标识回调对象的键值是一个在运行时计算的表达式,它标识用于回调操作的 URL。

4.7.18.1 模式化字段
字段模式 类型 描述
{expression} 路径项对象 用于定义回调请求和预期响应的 Path Item 对象。可在此处找到完整的示例。

此对象可以使用规范扩展进行扩展。

4.7.18.2 键表达式

标识Path Item Object的键是一个运行时表达式,可以在运行时 HTTP 请求/响应的上下文中计算,以标识将用于回调请求的 URL。一个简单的示例可能是$request.body#/url。但是,使用运行时表达式可以访问完整的 HTTP 消息。这包括访问 JSON 指针[RFC6901]可以引用的主体任何部分。

例如,给定以下 HTTP 请求

POST /subscribe/myevent?queryUrl=http://clientdomain.com/stillrunning HTTP/1.1
Host: example.org
Content-Type: application/json
Content-Length: 187

{
  "failedUrl" : "http://clientdomain.com/failed",
  "successUrls" : [
    "http://clientdomain.com/fast",
    "http://clientdomain.com/medium",
    "http://clientdomain.com/slow"
  ]
}

201 Created
Location: http://example.org/subscription/1

以下示例显示了各种表达式的计算方式,假设回调操作具有名为eventType的路径参数和名为queryUrl的查询参数。

表达式
$url http://example.org/subscribe/myevent?queryUrl=http://clientdomain.com/stillrunning
$method POST
$request.path.eventType myevent
$request.query.queryUrl http://clientdomain.com/stillrunning
$request.header.content-Type application/json
$request.body#/failedUrl http://clientdomain.com/failed
$request.body#/successUrls/2 http://clientdomain.com/medium
$response.header.Location http://example.org/subscription/1
4.7.18.3 回调对象示例

以下示例显示了对请求主体中idemail属性指定的 URL 的回调。

myWebhook:
  'http://notificationServer.com?transactionId={$request.body#/id}&email={$request.body#/email}':
    post:
      requestBody:
        description: Callback payload
        content:
          'application/json':
            schema:
              $ref: '#/components/schemas/SomePayload'
      responses:
        '200':
          description: webhook successfully processed and no retries will be performed

4.7.19 示例对象

4.7.19.1 固定字段
字段名称 类型 描述
summary 字符串 示例的简短描述。
description 字符串 示例的详细描述。[CommonMark]语法可以用于富文本表示。
value 任何 嵌入的文字示例。value字段和externalValue字段是互斥的。要表示不能以 JSON 或 YAML 自然表示的媒体类型的示例,请使用字符串值包含示例,并在必要时进行转义。
externalValue 字符串 指向文字示例的 URL。这提供了引用不能轻松包含在 JSON 或 YAML 文档中的示例的功能。value字段和externalValue字段是互斥的。

此对象可以使用规范扩展进行扩展。

在所有情况下,示例值都应与其关联值的类型模式兼容。工具实现可以选择自动验证兼容性,并在不兼容时拒绝示例值。

4.7.19.2 示例对象示例

在模型中

schemas:
  properties:
    name:
      type: string
      examples:
        name:
          $ref: http://example.org/petapi-examples/openapi.json#/components/examples/name-example

在请求主体中

requestBody:
  content:
    'application/json':
      schema:
        $ref: '#/components/schemas/Address'
      examples:
        foo:
          summary: A foo example
          value: {"foo": "bar"}
        bar:
          summary: A bar example
          value: {"bar": "baz"}
    'application/xml':
      examples:
        xmlExample:
          summary: This is an example in XML
          externalValue: 'http://example.org/examples/address-example.xml'
    'text/plain':
      examples:
        textExample:
          summary: This is a text example
          externalValue: 'http://foo.bar/examples/address-example.txt'

在参数中

parameters:
  - name: 'zipCode'
    in: 'query'
    schema:
      type: 'string'
      format: 'zip-code'
      examples:
        zip-example:
          $ref: '#/components/examples/zip-example'

在响应中

responses:
  '200':
    description: your car appointment has been booked
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/SuccessResponse'
        examples:
          confirmation-success:
            $ref: '#/components/examples/confirmation-success'

4.7.21 标头对象

标头对象遵循参数对象的结构,并进行了以下更改

  1. name不得指定,它在相应的headers映射中给出。
  2. in不得指定,它隐式地在header中。
  3. 受位置影响的所有特征必须适用于header的位置(例如,style)。
4.7.21.1 标头对象示例

一个简单的类型为integer的标头

{
  "description": "The number of allowed requests in the current period",
  "schema": {
    "type": "integer"
  }
}
description: The number of allowed requests in the current period
schema:
  type: integer

4.7.22 标签对象

操作对象使用的单个标签添加元数据。对于在操作对象实例中定义的每个标签,不一定需要一个标签对象。

4.7.22.1 固定字段
字段名称 类型 描述
name 字符串 必需。标签的名称。
description 字符串 标签的简短描述。[CommonMark]语法可以用于富文本表示。
externalDocs 外部文档对象 此标签的其他外部文档。

此对象可以使用规范扩展进行扩展。

4.7.22.2 标签对象示例
{
	"name": "pet",
	"description": "Pets operations"
}
name: pet
description: Pets operations

4.7.23 引用对象

一个简单的对象,允许引用规范中的其他组件,包括内部和外部。

引用对象由JSON Reference定义,并遵循相同的结构、行为和规则。

对于此规范,引用解析根据 JSON Reference 规范完成,而不是根据 JSON Schema 规范完成。

4.7.23.1 固定字段
字段名称 类型 描述
$ref 字符串 必需。引用字符串。

此对象不能使用其他属性进行扩展,并且添加的任何属性都应被忽略。

4.7.23.2 引用对象示例
{
	"$ref": "#/components/schemas/Pet"
}
$ref: '#/components/schemas/Pet'
4.7.23.3 相对模式文档示例
{
  "$ref": "Pet.json"
}
$ref: Pet.yaml
4.7.23.4 包含嵌入式模式的相对文档示例
{
  "$ref": "definitions.json#/Pet"
}
$ref: definitions.yaml#/Pet

4.7.24 模式对象

Schema 对象允许定义输入和输出数据类型。这些类型可以是对象,也可以是基本类型和数组。此对象是JSON Schema 规范 Wright 草稿 00的扩展子集。

有关属性的更多信息,请参见JSON Schema CoreJSON Schema Validation。除非另有说明,否则属性定义遵循 JSON Schema。

4.7.24.1 属性

以下属性直接取自 JSON Schema 定义,并遵循相同的规范

  • title
  • multipleOf
  • maximum
  • exclusiveMaximum
  • minimum
  • exclusiveMinimum
  • maxLength
  • minLength
  • pattern(此字符串是有效的正则表达式,根据ECMA 262 正则表达式方言)
  • maxItems
  • minItems
  • uniqueItems
  • maxProperties
  • minProperties
  • required
  • enum

以下属性取自 JSON Schema 定义,但其定义已调整为 OpenAPI 规范。

  • type - 值必须是字符串。不支持通过数组使用多个类型。
  • allOf - 内联或引用的模式必须Schema 对象,而不是标准的 JSON Schema。
  • oneOf - 内联或引用的模式必须Schema 对象,而不是标准的 JSON Schema。
  • anyOf - 内联或引用的模式必须Schema 对象,而不是标准的 JSON Schema。
  • not - 内联或引用的模式必须Schema 对象,而不是标准的 JSON Schema。
  • items - 值必须是对象,而不是数组。内联或引用的模式必须Schema 对象,而不是标准的 JSON Schema。如果typearray,则必须存在items
  • properties - 属性定义必须Schema 对象,而不是标准的 JSON Schema(内联或引用)。
  • additionalProperties - 值可以是布尔值或对象。内联或引用的模式必须Schema 对象,而不是标准的 JSON Schema。与 JSON Schema 一致,additionalProperties默认为true
  • description - [CommonMark]语法可以用于富文本表示。
  • format - 请参阅数据类型格式以获取更多详细信息。虽然依赖于 JSON Schema 定义的格式,但 OAS 提供了一些其他预定义格式。
  • default - 默认值表示如果未提供输入的值,则输入的使用者将假定为模式的值。与 JSON Schema 不同,该值必须符合在同一级别定义的 Schema 对象的定义类型。例如,如果typestring,则default可以为"foo",但不能为1

或者,在可以使用 Schema 对象的任何时候,都可以使用引用对象来代替它。这允许引用定义而不是内联定义它们。

此处未提及的 JSON Schema 规范定义的其他属性严格不支持。

除了 JSON Schema 子集字段之外,以下字段可以用于进一步的模式文档

4.7.24.2 固定字段
字段名称 类型 描述
nullable 布尔值 允许为定义的模式发送null值。默认值为false
discriminator 鉴别器对象 添加对多态性的支持。鉴别器是一个对象名称,用于区分可能满足有效负载描述的其他模式。有关更多详细信息,请参阅组合和继承
readOnly 布尔值 仅与 Schema "properties"定义相关。将属性声明为“只读”。这意味着它可以作为响应的一部分发送,但不应作为请求的一部分发送。如果属性被标记为readOnlytrue并且在required列表中,则required将仅对响应生效。属性不得同时标记为readOnlywriteOnlytrue。默认值为false
writeOnly 布尔值 仅适用于模式"properties"定义。将属性声明为“只写”。因此,它可以作为请求的一部分发送,但不应该作为响应的一部分发送。如果属性被标记为writeOnlytrue并且在required列表中,则required将仅对请求生效。属性不能同时标记为readOnlywriteOnlytrue。默认值为false
xml XML 对象 可以仅用于属性模式。它对根模式没有影响。添加其他元数据来描述此属性的 XML 表示形式。
externalDocs 外部文档对象 此模式的其他外部文档。
example 任何 一个自由格式的属性,用于包含此模式实例的示例。为了表示 JSON 或 YAML 中无法自然表示的示例,可以使用字符串值来包含示例,并在必要时进行转义。
deprecated 布尔值 指定模式已弃用,并且应该停止使用。默认值为false

此对象可以使用规范扩展进行扩展。

4.7.24.2.1 组合和继承(多态)

OpenAPI 规范允许使用 JSON Schema 的allOf属性组合和扩展模型定义,实际上提供了模型组合。allOf采用一个对象定义数组,这些定义独立验证,但共同构成一个对象。

虽然组合提供了模型扩展性,但它并不意味着模型之间存在层次结构。为了支持多态性,OpenAPI 规范添加了discriminator字段。使用时,discriminator将是决定哪个模式定义验证模型结构的属性的名称。因此,discriminator字段必须是必填字段。有两种方法可以为继承的实例定义鉴别器的值。

  • 使用模式名称。
  • 通过使用新值覆盖属性来覆盖模式名称。如果存在新值,则优先于模式名称。因此,没有给定 ID 的内联模式定义不能用于多态性。
4.7.24.2.2 XML 建模

xml属性允许在将 JSON 定义转换为 XML 时进行额外的定义。该XML 对象包含有关可用选项的更多信息。

4.7.24.3 模式对象示例
4.7.24.3.1 原始示例
{
  "type": "string",
  "format": "email"
}
type: string
format: email
4.7.24.3.2 简单模型
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "address": {
      "$ref": "#/components/schemas/Address"
    },
    "age": {
      "type": "integer",
      "format": "int32",
      "minimum": 0
    }
  }
}
type: object
required:
- name
properties:
  name:
    type: string
  address:
    $ref: '#/components/schemas/Address'
  age:
    type: integer
    format: int32
    minimum: 0
4.7.24.3.3 具有映射/字典属性的模型

对于简单的字符串到字符串映射

{
  "type": "object",
  "additionalProperties": {
    "type": "string"
  }
}
type: object
additionalProperties:
  type: string

对于字符串到模型的映射

{
  "type": "object",
  "additionalProperties": {
    "$ref": "#/components/schemas/ComplexModel"
  }
}
type: object
additionalProperties:
  $ref: '#/components/schemas/ComplexModel'
4.7.24.3.4 带有示例的模型
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "format": "int64"
    },
    "name": {
      "type": "string"
    }
  },
  "required": [
    "name"
  ],
  "example": {
    "name": "Puma",
    "id": 1
  }
}
type: object
properties:
  id:
    type: integer
    format: int64
  name:
    type: string
required:
- name
example:
  name: Puma
  id: 1
4.7.24.3.5 具有组合的模型
{
  "components": {
    "schemas": {
      "ErrorModel": {
        "type": "object",
        "required": [
          "message",
          "code"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "code": {
            "type": "integer",
            "minimum": 100,
            "maximum": 600
          }
        }
      },
      "ExtendedErrorModel": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ErrorModel"
          },
          {
            "type": "object",
            "required": [
              "rootCause"
            ],
            "properties": {
              "rootCause": {
                "type": "string"
              }
            }
          }
        ]
      }
    }
  }
}
components:
  schemas:
    ErrorModel:
      type: object
      required:
      - message
      - code
      properties:
        message:
          type: string
        code:
          type: integer
          minimum: 100
          maximum: 600
    ExtendedErrorModel:
      allOf:
      - $ref: '#/components/schemas/ErrorModel'
      - type: object
        required:
        - rootCause
        properties:
          rootCause:
            type: string
4.7.24.3.6 具有多态支持的模型
{
  "components": {
    "schemas": {
      "Pet": {
        "type": "object",
        "discriminator": {
          "propertyName": "petType"
        },
        "properties": {
          "name": {
            "type": "string"
          },
          "petType": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "petType"
        ]
      },
      "Cat": {
        "description": "A representation of a cat. Note that `Cat` will be used as the discriminator value.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Pet"
          },
          {
            "type": "object",
            "properties": {
              "huntingSkill": {
                "type": "string",
                "description": "The measured skill for hunting",
                "default": "lazy",
                "enum": [
                  "clueless",
                  "lazy",
                  "adventurous",
                  "aggressive"
                ]
              }
            },
            "required": [
              "huntingSkill"
            ]
          }
        ]
      },
      "Dog": {
        "description": "A representation of a dog. Note that `Dog` will be used as the discriminator value.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Pet"
          },
          {
            "type": "object",
            "properties": {
              "packSize": {
                "type": "integer",
                "format": "int32",
                "description": "the size of the pack the dog is from",
                "default": 0,
                "minimum": 0
              }
            },
            "required": [
              "packSize"
            ]
          }
        ]
      }
    }
  }
}
components:
  schemas:
    Pet:
      type: object
      discriminator:
        propertyName: petType
      properties:
        name:
          type: string
        petType:
          type: string
      required:
      - name
      - petType
    Cat:  ## "Cat" will be used as the discriminator value
      description: A representation of a cat
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        properties:
          huntingSkill:
            type: string
            description: The measured skill for hunting
            enum:
            - clueless
            - lazy
            - adventurous
            - aggressive
        required:
        - huntingSkill
    Dog:  ## "Dog" will be used as the discriminator value
      description: A representation of a dog
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        properties:
          packSize:
            type: integer
            format: int32
            description: the size of the pack the dog is from
            default: 0
            minimum: 0
        required:
        - packSize

4.7.25 鉴别器对象

当请求正文或响应有效负载可能是许多不同模式之一时,可以使用discriminator对象来帮助序列化、反序列化和验证。鉴别器是模式中的一个特定对象,用于根据与其关联的值向规范的使用者告知备用模式。

使用鉴别器时,内联模式将不会被考虑。

4.7.25.1 固定字段
字段名称 类型 描述
propertyName 字符串 必需。有效负载中保存鉴别器值的属性的名称。
mapping Map[string, string] 一个对象,用于保存有效负载值和模式名称或引用之间的映射。

仅当使用组合关键字oneOfanyOfallOf之一时,鉴别器对象才合法。

在 OAS 3.0 中,响应有效负载可以被描述为正好是任意数量的类型之一

MyResponseType:
  oneOf:
  - $ref: '#/components/schemas/Cat'
  - $ref: '#/components/schemas/Dog'
  - $ref: '#/components/schemas/Lizard'

这意味着有效负载必须通过验证完全匹配由CatDogLizard描述的模式之一。在这种情况下,鉴别器可以充当“提示”以缩短验证和匹配模式的选择,这可能是代价高昂的操作,具体取决于模式的复杂性。然后我们可以准确地描述哪个字段告诉我们使用哪个模式

MyResponseType:
  oneOf:
  - $ref: '#/components/schemas/Cat'
  - $ref: '#/components/schemas/Dog'
  - $ref: '#/components/schemas/Lizard'
  discriminator:
    propertyName: petType

现在的期望是,响应有效负载中必须存在名为petType的属性,并且该值将对应于 OAS 文档中定义的模式的名称。因此,响应有效负载

{
  "id": 12345,
  "petType": "Cat"
}

将指示Cat模式与此有效负载一起使用。

在鉴别器字段的值与模式名称不匹配或无法进行隐式映射的情况下,可以使用可选的mapping定义

MyResponseType:
  oneOf:
  - $ref: '#/components/schemas/Cat'
  - $ref: '#/components/schemas/Dog'
  - $ref: '#/components/schemas/Lizard'
  - $ref: 'https://gigantic-server.com/schemas/Monster/schema.json'
  discriminator:
    propertyName: petType
    mapping:
      dog: '#/components/schemas/Dog'
      monster: 'https://gigantic-server.com/schemas/Monster/schema.json'

此处,鉴别器dog将映射到模式#/components/schemas/Dog,而不是Dog的默认(隐式)值。如果鉴别器与隐式或显式映射不匹配,则无法确定模式,并且验证应该失败。映射键必须是字符串值,但工具可以将响应值转换为字符串以进行比较。

当与anyOf结构一起使用时,使用鉴别器可以避免多个模式可能满足单个有效负载的情况下的歧义。

oneOfanyOf用例中,所有可能的模式必须被显式列出。为了避免冗余,可以将鉴别器添加到父模式定义中,并且allOf结构中包含父模式的所有模式都可以用作备用模式。

例如

components:
  schemas:
    Pet:
      type: object
      required:
      - petType
      properties:
        petType:
          type: string
      discriminator:
        propertyName: petType
        mapping:
          dog: Dog
    Cat:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Cat`
        properties:
          name:
            type: string
    Dog:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Dog`
        properties:
          bark:
            type: string
    Lizard:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Lizard`
        properties:
          lovesRocks:
            type: boolean

这样的有效负载

{
  "petType": "Cat",
  "name": "misty"
}

将指示使用Cat模式。同样,此模式

{
  "petType": "dog",
  "bark": "soft"
}

将映射到Dog,因为mappings元素中的定义。

4.7.26 XML 对象

一个元数据对象,允许更精细的 XML 模型定义。

使用数组时,不会推断 XML 元素名称(对于单数/复数形式),并且应该使用name属性添加该信息。请参阅示例以了解预期行为。

4.7.26.1 固定字段
字段名称 类型 描述
name 字符串 替换用于描述的模式属性的元素/属性的名称。在items中定义时,它将影响列表中各个 XML 元素的名称。当与typearray(在items之外)一起定义时,它将影响包装元素,并且仅当wrappedtrue时。如果wrappedfalse,则将被忽略。
namespace 字符串 命名空间定义的 URI。值必须采用绝对 URI 的形式。
prefix 字符串 要用于name的前缀。
attribute 布尔值 声明属性定义是否转换为属性而不是元素。默认值为false
wrapped 布尔值 可以仅用于数组定义。表示数组是否已包装(例如,<books><book/><book/></books>)或未包装(<book/><book/>)。默认值为false。仅当与typearray(在items之外)一起定义时,该定义才会生效。

此对象可以使用规范扩展进行扩展。

4.7.26.2 XML 对象示例

XML 对象定义的示例包含在模式对象的属性定义内,并包含其 XML 表示形式的示例。

4.7.26.2.1 无 XML 元素

基本字符串属性

{
    "animals": {
        "type": "string"
    }
}
animals:
  type: string
<animals>...</animals>

基本字符串数组属性(wrapped默认为false

{
    "animals": {
        "type": "array",
        "items": {
            "type": "string"
        }
    }
}
animals:
  type: array
  items:
    type: string
<animals>...</animals>
<animals>...</animals>
<animals>...</animals>
4.7.26.2.2 XML 名称替换
{
  "animals": {
    "type": "string",
    "xml": {
      "name": "animal"
    }
  }
}
animals:
  type: string
  xml:
    name: animal
<animal>...</animal>
4.7.26.2.3 XML 属性、前缀和命名空间

在此示例中,显示了完整的模型定义。

{
  "Person": {
    "type": "object",
    "properties": {
      "id": {
        "type": "integer",
        "format": "int32",
        "xml": {
          "attribute": true
        }
      },
      "name": {
        "type": "string",
        "xml": {
          "namespace": "http://example.com/schema/sample",
          "prefix": "sample"
        }
      }
    }
  }
}
Person:
  type: object
  properties:
    id:
      type: integer
      format: int32
      xml:
        attribute: true
    name:
      type: string
      xml:
        namespace: http://example.com/schema/sample
        prefix: sample
<Person id="123">
    <sample:name xmlns:sample="http://example.com/schema/sample">example</sample:name>
</Person>
4.7.26.2.4 XML 数组

更改元素名称

{
  "animals": {
    "type": "array",
    "items": {
      "type": "string",
      "xml": {
        "name": "animal"
      }
    }
  }
}
animals:
  type: array
  items:
    type: string
    xml:
      name: animal
<animal>value</animal>
<animal>value</animal>

外部name属性对 XML 没有影响

{
  "animals": {
    "type": "array",
    "items": {
      "type": "string",
      "xml": {
        "name": "animal"
      }
    },
    "xml": {
      "name": "aliens"
    }
  }
}
animals:
  type: array
  items:
    type: string
    xml:
      name: animal
  xml:
    name: aliens
<animal>value</animal>
<animal>value</animal>

即使数组已包装,如果未显式定义名称,则内部和外部都将使用相同的名称

{
  "animals": {
    "type": "array",
    "items": {
      "type": "string"
    },
    "xml": {
      "wrapped": true
    }
  }
}
animals:
  type: array
  items:
    type: string
  xml:
    wrapped: true
<animals>
  <animals>value</animals>
  <animals>value</animals>
</animals>

为了克服上面示例中的命名问题,可以使用以下定义

{
  "animals": {
    "type": "array",
    "items": {
      "type": "string",
      "xml": {
        "name": "animal"
      }
    },
    "xml": {
      "wrapped": true
    }
  }
}
animals:
  type: array
  items:
    type: string
    xml:
      name: animal
  xml:
    wrapped: true
<animals>
  <animal>value</animal>
  <animal>value</animal>
</animals>

影响内部和外部名称

{
  "animals": {
    "type": "array",
    "items": {
      "type": "string",
      "xml": {
        "name": "animal"
      }
    },
    "xml": {
      "name": "aliens",
      "wrapped": true
    }
  }
}
animals:
  type: array
  items:
    type: string
    xml:
      name: animal
  xml:
    name: aliens
    wrapped: true
<aliens>
  <animal>value</animal>
  <animal>value</animal>
</aliens>

如果我们更改外部元素但未更改内部元素

{
  "animals": {
    "type": "array",
    "items": {
      "type": "string"
    },
    "xml": {
      "name": "aliens",
      "wrapped": true
    }
  }
}
animals:
  type: array
  items:
    type: string
  xml:
    name: aliens
    wrapped: true
<aliens>
  <aliens>value</aliens>
  <aliens>value</aliens>
</aliens>

4.7.27 安全方案对象

定义可由操作使用的安全方案。支持的方案包括 HTTP 身份验证、API 密钥(作为标头、cookie 参数或查询参数)、OAuth2 的常用流程(隐式、密码、应用程序和访问代码),如[RFC6749]中所定义,以及OpenID Connect Discovery

4.7.27.1 固定字段
字段名称 类型 应用于 描述
type 字符串 任何 必需。安全方案的类型。有效值为"apiKey""http""oauth2""openIdConnect"
description 字符串 任何 安全方案的简短描述。[CommonMark]语法可以用于富文本表示。
name 字符串 apiKey 必需。要使用的标头、查询或 cookie 参数的名称。
in 字符串 apiKey 必需。API 密钥的位置。有效值为"query""header""cookie"
scheme 字符串 http 必需。要在授权标头中使用的 HTTP 授权方案的名称,如[RFC7235] 第 5.1 节中所定义。
bearerFormat 字符串 http ("bearer") 提示客户端识别承载令牌的格式。承载令牌通常由授权服务器生成,因此此信息主要用于文档目的。
flows OAuth 流程对象 oauth2 必需。一个包含支持的流程类型的配置信息的物件。
openIdConnectUrl 字符串 openIdConnect 必需。发现 OAuth2 配置值的 OpenId Connect URL。这必须采用 URL 的形式。

此对象可以使用规范扩展进行扩展。

4.7.27.2 安全方案对象示例
4.7.27.2.1 基本身份验证示例
{
  "type": "http",
  "scheme": "basic"
}
type: http
scheme: basic
4.7.27.2.2 API 密钥示例
{
  "type": "apiKey",
  "name": "api_key",
  "in": "header"
}
type: apiKey
name: api_key
in: header
4.7.27.2.3 JWT 载体示例
{
  "type": "http",
  "scheme": "bearer",
  "bearerFormat": "JWT",
}
type: http
scheme: bearer
bearerFormat: JWT
4.7.27.2.4 隐式 OAuth2 示例
{
  "type": "oauth2",
  "flows": {
    "implicit": {
      "authorizationUrl": "https://example.com/api/oauth/dialog",
      "scopes": {
        "write:pets": "modify pets in your account",
        "read:pets": "read your pets"
      }
    }
  }
}
type: oauth2
flows:
  implicit:
    authorizationUrl: https://example.com/api/oauth/dialog
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets

4.7.28 OAuth 流对象

允许配置支持的 OAuth 流程。

4.7.28.1 固定字段
字段名称 类型 描述
implicit OAuth 流程对象 OAuth 隐式流程的配置
password OAuth 流程对象 OAuth 资源所有者密码流程的配置
clientCredentials OAuth 流程对象 OAuth 客户端凭据流程的配置。在 OpenAPI 2.0 中以前称为application
authorizationCode OAuth 流程对象 OAuth 授权码流程的配置。在 OpenAPI 2.0 中以前称为accessCode

此对象可以使用规范扩展进行扩展。

4.7.29 OAuth 流对象

支持的 OAuth 流程的配置详细信息

4.7.29.1 固定字段
字段名称 类型 应用于 描述
authorizationUrl 字符串 oauth2 ("implicit", "authorizationCode") 必需。要用于此流程的授权 URL。这必须采用 URL 的形式。
tokenUrl 字符串 oauth2 ("password", "clientCredentials", "authorizationCode") 必需。要用于此流程的令牌 URL。这必须采用 URL 的形式。
refreshUrl 字符串 oauth2 用于获取刷新令牌的 URL。这必须采用 URL 的形式。
scopes Map[string, string] oauth2 必需。OAuth2 安全方案的可用范围。范围名称与其简短描述之间的映射。

此对象可以使用规范扩展进行扩展。

4.7.29.2 OAuth 流对象示例
{
  "type": "oauth2",
  "flows": {
    "implicit": {
      "authorizationUrl": "https://example.com/api/oauth/dialog",
      "scopes": {
        "write:pets": "modify pets in your account",
        "read:pets": "read your pets"
      }
    },
    "authorizationCode": {
      "authorizationUrl": "https://example.com/api/oauth/dialog",
      "tokenUrl": "https://example.com/api/oauth/token",
      "scopes": {
        "write:pets": "modify pets in your account",
        "read:pets": "read your pets"
      }
    }
  }
}
type: oauth2
flows:
  implicit:
    authorizationUrl: https://example.com/api/oauth/dialog
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets
  authorizationCode:
    authorizationUrl: https://example.com/api/oauth/dialog
    tokenUrl: https://example.com/api/oauth/token
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets

4.7.30 安全需求对象

列出执行此操作所需的安全性方案。每个属性使用的名称必须对应于安全性方案中在组件对象下声明的安全性方案。

包含多个方案的安全性需求对象要求所有方案必须满足才能授权请求。这支持需要多个查询参数或 HTTP 标头来传达安全信息的情况。

当在OpenAPI 对象操作对象上定义安全需求对象列表时,只需要满足列表中的一个安全需求对象即可授权请求。

4.7.30.1 模式化字段
字段模式 类型 描述
{name} [string] 每个名称必须对应于在安全方案(位于组件对象下)中声明的安全方案。如果安全方案的类型为"oauth2""openIdConnect",则该值为执行所需的一系列作用域名称。对于其他安全方案类型,数组必须为空。
4.7.30.2 安全需求对象示例
4.7.30.2.1 非 OAuth2 安全需求
{
  "api_key": []
}
api_key: []
4.7.30.2.2 OAuth2 安全需求
{
  "petstore_auth": [
    "write:pets",
    "read:pets"
  ]
}
petstore_auth:
- write:pets
- read:pets

4.8 规范扩展

虽然 OpenAPI 规范尝试适应大多数用例,但可以在某些点添加其他数据来扩展规范。

扩展属性实现为模式化字段,始终以"x-"为前缀。

字段模式 类型 描述
^x- 任何 允许扩展 OpenAPI Schema。字段名称必须x-开头,例如x-internal-id。该值可以是null、基本类型、数组或对象。可以具有任何有效的 JSON 格式值。

可用的工具可能支持也可能不支持扩展,但这些工具也可以扩展以添加请求的支持(如果工具是内部的或开源的)。

4.9 安全过滤

OpenAPI 规范中的一些对象可以被声明并保持为空,或者完全删除,即使它们本质上是 API 文档的核心。

这样做的原因是为了允许对文档进行额外的访问控制层。虽然本身不是规范的一部分,但某些库可以选择根据某种形式的身份验证/授权来允许访问文档的某些部分。

以下是两个示例

  1. 路径对象可以为空。这可能违反直觉,但这可能会告诉查看者他们来到了正确的位置,但无法访问任何文档。他们仍然可以访问信息对象,其中可能包含有关身份验证的其他信息。
  2. 路径项对象可以为空。在这种情况下,查看者将知道该路径存在,但将无法看到任何操作或参数。这与从路径对象中隐藏路径本身不同,因此用户将不知道其存在。这允许文档提供者精确控制查看者可以看到的内容。

A. 附录 A:修订历史

版本 日期 备注
3.0.2 2018-10-08 OpenAPI 规范 3.0.2 的补丁版本
3.0.1 2017-12-06 OpenAPI 规范 3.0.1 的补丁版本
3.0.0 2017-07-26 OpenAPI 规范 3.0.0 的发布版本
3.0.0-rc2 2017-06-16 3.0 规范的 rc2 版本
3.0.0-rc1 2017-04-27 3.0 规范的 rc1 版本
3.0.0-rc0 2017-02-28 3.0 规范的实现者草案
2.0 2015-12-31 将 Swagger 2.0 捐赠给 OpenAPI Initiative
2.0 2014-09-08 Swagger 2.0 的发布版本
1.2 2014-03-14 正式文档的初始发布版本。
1.1 2012-08-22 Swagger 1.1 的发布版本
1.0 2011-08-10 Swagger 规范的第一个发布版本

B. 参考文献

B.1 规范性引用

[ABNF]
语法规范增强 BNF:ABNF。D. Crocker,编辑;P. Overell。IETF。2008 年 1 月。互联网标准。URL:https://www.rfc-editor.org/rfc/rfc5234
[CommonMark]
CommonMark 规范。URL:https://spec.commonmark.org/
[CommonMark-0.27]
CommonMark 规范,版本 0.27。John MacFarlane。2016 年 11 月 18 日。URL:https://spec.commonmark.org/0.27/
[IANA-HTTP-STATUS-CODES]
超文本传输协议 (HTTP) 状态代码注册表。IANA。URL:https://www.iana.org/assignments/http-status-codes/
[JSON-Reference]
JSON 参考。Paul Bryan;Kris Zyp。互联网工程任务组 (IETF)。2012 年 9 月 16 日。互联网草案。URL:https://datatracker.ietf.org/doc/html/draft-pbryan-zyp-json-ref-03
[JSON-Schema-05]
JSON Schema:描述 JSON 文档的媒体类型。草案 5。Austin Wright。互联网工程任务组 (IETF)。2016 年 10 月 13 日。互联网草案。URL:https://datatracker.ietf.org/doc/html/draft-wright-json-schema-00
[JSON-Schema-Validation-05]
JSON Schema 验证:JSON 结构验证的词汇表。草案 5。Austin Wright;G. Luff。互联网工程任务组 (IETF)。2016 年 10 月 13 日。互联网草案。URL:https://datatracker.ietf.org/doc/html/draft-wright-json-schema-validation-00
[RFC1866]
超文本标记语言 - 2.0。T. Berners-Lee;D. Connolly。IETF。1995 年 11 月。历史版本。URL:https://www.rfc-editor.org/rfc/rfc1866
[RFC2119]
用于 RFC 中指示需求级别的关键词。S. Bradner。IETF。1997 年 3 月。最佳实践。URL:https://www.rfc-editor.org/rfc/rfc2119
[RFC3339]
互联网上的日期和时间:时间戳。G. Klyne;C. Newman。IETF。2002 年 7 月。建议标准。URL:https://www.rfc-editor.org/rfc/rfc3339
[RFC3986]
统一资源标识符 (URI):通用语法。T. Berners-Lee;R. Fielding;L. Masinter。IETF。2005 年 1 月。互联网标准。URL:https://www.rfc-editor.org/rfc/rfc3986
[RFC6570]
URI 模板。J. Gregorio;R. Fielding;M. Hadley;M. Nottingham;D. Orchard。IETF。2012 年 3 月。建议标准。URL:https://www.rfc-editor.org/rfc/rfc6570
[RFC6749]
OAuth 2.0 授权框架。D. Hardt,编辑。IETF。2012 年 10 月。建议标准。URL:https://www.rfc-editor.org/rfc/rfc6749
[RFC6838]
媒体类型规范和注册程序。N. Freed;J. Klensin;T. Hansen。IETF。2013 年 1 月。最佳实践。URL:https://www.rfc-editor.org/rfc/rfc6838
[RFC6901]
JavaScript 对象表示法 (JSON) 指针。P. Bryan,编辑;K. Zyp;M. Nottingham,编辑。IETF。2013 年 4 月。建议标准。URL:https://www.rfc-editor.org/rfc/rfc6901
[RFC7159]
JavaScript 对象表示法 (JSON) 数据交换格式。T. Bray,编辑。IETF。2014 年 3 月。建议标准。URL:https://www.rfc-editor.org/rfc/rfc7159
[RFC7230]
超文本传输协议 (HTTP/1.1):消息语法和路由。R. Fielding,编辑;J. Reschke,编辑。IETF。2014 年 6 月。建议标准。URL:https://httpwg.org/specs/rfc7230.html
[RFC7231]
超文本传输协议 (HTTP/1.1):语义和内容。R. Fielding,编辑;J. Reschke,编辑。IETF。2014 年 6 月。建议标准。URL:https://httpwg.org/specs/rfc7231.html
[RFC7235]
超文本传输协议 (HTTP/1.1):身份验证。R. Fielding,编辑;J. Reschke,编辑。IETF。2014 年 6 月。建议标准。URL:https://httpwg.org/specs/rfc7235.html
[RFC8174]
RFC 2119 关键词中大写和小写的不确定性。B. Leiba。IETF。2017 年 5 月。最佳实践。URL:https://www.rfc-editor.org/rfc/rfc8174
[YAML]
YAML 不是标记语言 (YAML™) 版本 1.2。Oren Ben-Kiki;Clark Evans;Ingy döt Net。2009 年 10 月 1 日。URL:http://yaml.org/spec/1.2/spec.html