11

我正在为其编写 Swagger 2.0 规范的 API 基本上是任何 JSON 值的存储。

我想要一个读取值的路径和一个存储非预定义深度的任何 JSON 值(null、数字、整数、字符串、对象、数组)的路径。

不幸的是,Swagger 2.0 似乎对输入和输出的模式非常严格,并且不允许 JSON Schema 允许的整个模式集。Swagger 编辑器不允许混合值(例如,可以是布尔值或整数的属性)或松散定义的数组(必须严格定义项目的类型)和对象。

所以我正在尝试通过定义MixedValue模式来解决问题:

---
swagger: '2.0'
info:
  version: 0.0.1
  title: Data store API
consumes:
- application/json
produces:
- application/json
paths:
  /attributes/{attrId}/value:
    parameters:
    - name: attrId
      in: path
      type: string
      required: true
    get:
      responses:
        '200':
          description: Successful.
          schema:
            $ref: '#/definitions/MixedValue'
    put:
      parameters:
      - name: value
        in: body
        required: true
        schema:
          $ref: '#/definitions/MixedValue'
      responses:
      responses:
        '201':
          description: Successful.
definitions:
  MixedValue:
    type: object
    properties:
      type:
        type: string
        enum:
        - 'null'
        - boolean
        - number
        - integer
        - string
        - object
        - array
      boolean:
        type: boolean
      number:
        type: number
      integer:
        type: integer
      string:
        type: string
      object:
        description: deep JSON object
        type: object
        additionalProperties: true
      array:
        description: deep JSON array
        type: array
    required:
    - type

但是 Swagger Editor 拒绝松散定义的objectarray属性。

问题: - 有没有办法解决这个问题?- 它只是 Swagger 编辑器错误还是 Swagger 2.0 规范的强限制?- 有没有更好的方法(最佳实践)来指定我需要什么?- 我的 API 规范是否可以预期 swagger 为某些语言生成的代码存在一些限制?

4

2 回答 2

23

可以使用空模式定义任意类型的模式{}

# swagger: '2.0'
definitions:
  AnyValue: {}

# openapi: 3.0.0
components:
  schemas:
    AnyValue: {}

或者如果你想要一个description

# swagger: '2.0'
definitions:
  AnyValue:
    description: 'Can be anything: string, number, array, object, etc. (except `null`)'

# openapi: 3.0.0
components:
  schemas:
    AnyValue:
      description: 'Can be anything: string, number, array, object, etc., including `null`'

如果没有定义type,模式允许任何值。请注意,OpenAPI 2.0 规范不支持null值,但一些工具可能仍然支持空值。

在 OpenAPI 3.0 中,type-less 模式允许null值,除非其他约束(例如enum)明确禁止空值。

有关-less 模式如何工作的更多详细信息,请参阅此问答。type


以下是Swagger Editor 2.0AnyValue如何使用架构处理正文参数:

SwaggerEditor:使用任意类型的主体测试 PUT 请求

我不知道代码生成器如何处理这个问题。

于 2017-04-10T17:00:38.653 回答
0

也许这就是您正在寻找的“模式对象”:

字段模式:^x-

类型:任何

描述:允许对 Swagger Schema 进行扩展。字段名称必须以 x- 开头,例如 x-internal-id。该值可以是 null、基元、数组或对象。有关详细信息,请参阅供应商扩展。

来源:https ://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md

于 2015-10-01T07:00:14.653 回答