【发布时间】:2021-01-07 15:04:25
【问题描述】:
我想描述我的 API 将使用 JSON Schema 返回的 JSON,并引用我的 OpenAPI 配置文件中的模式。
我需要为每个 API 方法设置不同的架构。假设我支持GET /people 和GET /people/{id}。我知道如何定义一个“人”的模式一次,并在/people 和/people/{id} 中使用$ref 引用它。
[编辑:在帖子末尾看到一个(希望)更清晰的示例]
我不明白的是如何定义和重用我的响应的结构,即:
{
"success": true,
"result" : [results]
}
or
{
"success": false,
"message": [string]
}
使用anyOf(用于成功/错误格式检查和结果,引用各种模式(people-multi.json,people-single.json),我可以定义一个“根模式”api-response.json,我可以检查 JSON 响应的一般有效性,但它不允许我检查 /people 调用是否返回一个人数组而不是一个人,例如。
如何定义一个包含响应的一般结构的api-method-people.json(当然是来自外部架构,以保持其干燥)并在result 中注入另一个架构?
编辑:一个更具体的例子(希望以更清晰的方式呈现)
我有两个 JSON 模式来描述我的两个 API 方法的响应格式:method-1.json 和 method-2.json。
我可以这样定义它们(这里不是模式,我太懒了):
method-1.json:
{
success: (boolean),
result: { id: (integer), name: (string) }
}
method-2.json:
{
success: (boolean),
result: [ (integer), (integer), ... ]
}
但我不想重复结构(JSON 的第一级),所以我想在 response-base.json 中提取它,这将在 method-1.json 和 method-2.json 中以某种方式(?)引用,而不是为每个方法定义成功和结果属性。
简而言之,我想我想要某种组合或继承,而不是包含($ref 允许)。
【问题讨论】:
-
您将再次使用 $ref 引用,但在您使用的工具中的确切工作方式可能会有所不同。
-
注意,在 OpenAPI 3.1 之前(目前在 RC 中),您不能使用纯 JSON Schema,而是使用 OAI 定义的 JSON Schema 的子集。从 3.1 开始,您可以使用 FULL JSON Schema,这有望使这变得更容易......但当然,您现在正在寻找解决方案,而不是 3 个月的时间。
-
这与我使用的工具有什么关系?在我看来,要么 JSON Schema 规范定义了一种方法来做到这一点,要么它没有……对吧?
-
虽然 JSON Schema 确实支持这一点,但在 OpenAPI 3.1 之前,JSON Schema 已经完全被使用了。一些 OpenAPI 工具可能支持引用外部文件,有些可能不支持,AFAIK 这样做并没有在 OpenAPI 规范本身中定义。您必须查看工具文档。
-
好的,很高兴知道!你能给我一些关于 JSON Schema 如何支持这一点的指示吗?即使我使用的工具不支持它。我只是不知道如何定义一个
api-call-people.json模式,基本上说“api-call-base.json和people.json在result字段中。”我在文档中找不到。
标签: jsonschema openapi