JSON 超级模式草案 06 版本说明

从草案 luff-json-hyper-schema-00(草案 04)迁移到草案 wright-json-schema-hyperschema-01(草案 06)的版本说明。

注意:草案 07 已经发布

草案 07 的迁移说明 提供了从草案 04 迁移到草案 07 的更直接的概述,通过跳过草案 05 和草案 06 的复杂中间状态。保留此页面是为了历史兴趣,但不建议那些只想使用最新草案的人使用。

面向实现者: 建议只实现草案 07,而不是草案 06 或更早的版本。

问:草案 04 和草案 06 之间有哪些不兼容的更改?

在草案 04 和 06 之间,我们对超级模式进行了重大重新审查,超级模式从未像 JSON Schema 验证那样被广泛采用。

虽然我们知道草案 06 中仍然存在重大差距,但我们认为这是一组很好的更改,可以用来收集反馈。随着草案 07 的发布,应该使用该草案或更高版本,而草案 06 成为历史上的好奇。

从草案 04 到草案 05 的更改

关键字更改后果
"base"替换查找最近的“self”链接以确定 "href" 的基本 URI如果您依赖“self”链接来更改基本 URI,请明确设置 "base"
"rel"删除“full”关系使用 "item"
"rel"删除“instances”和“create”关系使用 "collection"
"rel"删除“root”关系在您的 "href" URI 模板中使用片段
"fragmentResolution"已删除媒体类型决定如何解释片段
"pathStart"已删除[没有替换]
"method"更改回 HTML 表单语义 的“get”和“post”,而不是所有 HTTP 方法[由于反馈表明这令人困惑,因此在草案 06 中再次更改]

从草案 05 到草案 06 的更改

关键字更改后果
"method"已删除对于 HTTP 方法建议,请参阅问题 #73#296(如果需要,使用 "method""allow" 作为扩展关键字);不再需要指示如何使用 "schema""encType"
"schema"已删除使用 "hrefSchema""submissionSchema""targetSchema"
"encType"已删除对请求正文使用 "submissionEncType";不再需要用于 URI 查询字符串
"hrefSchema"已添加替换 "method": "get", "schema": {...},具有附加功能
"submissionSchema"已添加替换 "method": "post", "schema": {...}
"submissionEncType"已添加替换 "method": "post", "encType": "..."
"href"删除预处理将在未来的草案中进行替换和扩展

正确使用 "targetSchema"

虽然 "targetSchema" 在最近的草案中并没有改变其含义,但它却被广泛误解。因此,将它按规定使用可能会让人感觉像是发生了改变。

由于草案-04 强调将单个 HTTP 方法作为 "method" 值,许多用户将 "targetSchema" 解释为对 "method" 中方法的响应的暗示。这从一开始就是错误的;所有草案都将此关键字定义为描述目标资源的表示形式,该表示形式作为对 HTTP GET 的响应出现,但可能出现在其他响应中,也可能不出现。

草案-06 阐明了这种用法,并提供了关于它与不同 HTTP 方法一起使用的指导。这包括将 "targetSchema" 用作 PUT 和 PATCH 的请求描述。在草案-04 中,许多用户使用 "schema" 来描述 PUT 和 PATCH 请求,这是没有必要的。

然而,"targetHints" 提案 已被接受加入草案-07。除其他事项外,它能够暗示 "Accept-Patch",这对于正确使用 "targetSchema" 与 HTTP PATCH 是必需的。草案-07 中将包含示例和详细指导。

问:为什么在草案-06 发布之前对超模式进行了一些重大更改?

答:在最终审查期间,人们发现关于如何使用该规范没有达成共识。这些后期更改对于发布一个具有明确含义的规范是必要的,这样我们才能获得对其内容的反馈,而不是不同的解释。最初我们试图简单地澄清现有内容,但后来我们意识到,人们一开始就对现有内容没有达成一致。

问:为什么该规范不再提及或表现得像 HTML?

答:我们达成共识,认为现有的类比弊大于利,原因有两个:

  1. 从草案-03 到草案-04 的改变,让 "method" 可以表示任何 HTTP 方法,而不是 HTML 的 <form method="..."> "get" 和 "post" 值,这破坏了最初与 HTML 的类比,而试图将其改回来则没有得到认可。
  2. 只能使用 "schema""encType" 用于 URI 查询字符串(但不是 URI 的其他部分)或请求主体,但没有办法同时使用它们,这对于 API 设计来说过于严格。

拆分 "schema"

与其让 "schema" 根据 "method" 执行两种不同的操作,我们将其拆分为两个关键字,每个关键字对应一个用途。这允许在需要时同时使用它们,这是 HTML 表单中没有的用例。

"hrefSchema" 替换了 "method": "get" 的用法,但它利用了 URI 模板变量,因此客户端数据驱动的动态 URI 不再局限于查询字符串。使用这种方法不再需要 "encType"

"submissionSchema" 直接替换了 "method": "post" 的用法,其中 "submissionEncType" 替换了 "encType"

删除 "method"

草案-05 试图恢复草案-03 中 "method" 的行为,但反馈告诉我们,用户发现这种改变非常令人困惑。在 "schema" 拆分之后,草案-05 中 "method" 的行为不再需要。

我们本可以切换到草案-04 中 "method" 的行为,但除了从反复更改中产生更多的困惑之外,草案-04 中对 "method" 的方法与 LDO 设计的其余部分也不一致。最显著的是,它造成了 "targetSchema" 用法的问题,如上所述。

答:理想情况下,这由您的链接关系类型隐式传达,这是跨机器面向超媒体的主要语义指示器。 RFC 5988 提供了有关创建自定义(又称“扩展”)链接关系的指导。

一些 URI 方案和命名空间,例如 urn: 方案中的 UUID 命名空间,或者 tag: 方案,特别适合创建唯一标识符。

当然,还有一些方法可以在运行时检测到这一点,例如 HTTP 的 "Allow" 响应标头,或者尝试一种方法并相应地处理 405 Method Not Allowed 错误。

答:"targetHints" 提案 是草案-07 的一部分,因此将其用作草案-06 的扩展是可行的,但我们建议此时只使用草案-07。

问:如果 "targetSchema" 不是响应,我如何描述响应?

答:您应该为各种成功和错误响应创建超模式,但是将它们连接到链接更多的是一个文档问题,而不是一个使用问题:每个响应都会指示自己的模式,因此您不需要在运行时提前知道它。

超模式从未有过一个关键字来明确地将响应与操作(如 HTTP 方法)相关联。这种用例似乎是关于生成 API 文档,因此这很可能是 JSON Schema API 文档词汇表 的候选者。

需要帮助?

您觉得这些文档有用吗?

帮助我们使我们的文档更出色!

在 JSON Schema,我们重视文档贡献,就像我们重视其他任何类型的贡献一样!

仍然需要帮助?

学习 JSON Schema 通常很令人困惑,但别担心,我们在这里帮助您!。