我正在为其编写Swagger 2.0规范的API基本上是任何JSON值的存储区。
我想要读取值的路径和存储非预定义深度的任何JSON值(空,数字,整数,字符串,对象,数组)的路径。
不幸的是,Swagger 2.0似乎对输入和输出的架构非常严格,并且不允许JSON Schema允许使用整个架构。 Swagger编辑器不允许使用混合值(例如,可以是 bool 值或整数的属性)或松散定义的数组(必须严格定义项的类型)和对象。
所以我正在尝试通过定义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编辑器拒绝松散定义的
object
和array
属性。问题:
-是否有解决此问题的方法?
-仅仅是Swagger编辑器的错误还是Swagger 2.0规范的强大限制?
-是否有更好的方法(最佳实践)来指定我需要的东西?
-我可以期望我的API规范对某些语言由大张旗鼓产生的代码有所限制吗?
最佳答案
可以使用空模式{}
定义任意类型的模式:
# 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
值,但是某些工具可能仍支持null。在OpenAPI 3.0中,除非其他约束(例如
type
)明确禁止使用null,否则null
-less模式将允许enum
值。有关无
type
模式的工作方式的更多详细信息,请参见this Q&A。这是Swagger Editor 2.0如何使用
AnyValue
模式处理主体参数的方法:我不知道代码生成器是如何处理的。
关于json - OpenAPI:接受任何(复杂)JSON值的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841298/