跳转至

更广泛的写入覆盖

Issue: https://github.com/morluto/rea/issues/4933

结果

四种录制形态将写入工具排除在清单之外,或使其写入得不到服务,尽管录制内容已经显示了这些写入的作用:

  • 无响应体回复。 返回 204 且无响应体的写入(Jellyfin 和 Shlink 的删除、Miniflux 和 Keycloak 的更新)没有类似 JSON 的内容类型,因此其分组被以 non-json 排除,从未成为工具。
  • 省略字段。 某个字段在视图的每次录制中都被携带,于是它成了必需字段;当应用在某些实体中省略空或假成员(Go 的 omitempty)时,写入门控会拒绝其自身的回读。
  • 投影读取。 只请求部分字段的条目读取(Directus 的 /items/provisions/2?fields=title)不会重复所请求的 id,因此它阻塞了整个条目视图的身份证明,导致该视图的写入没有状态目标。
  • 数字组序列。 以数字组拼写的序列(Homebox 的资产编号 000-005)不是整数,因此对其进行编号的创建操作没有对应规则,从而发生矛盾。

行为

  • 清单。 当每个响应都无响应体(204 或 205、空文本、或记录的 size 为零)且至少一个成功时,写入分组(POST、PUT、PATCH、DELETE)会被保留为工具。仅仅缺少文本并不算数。
  • 省略字段。 写入门控会记录:当一次成功读取未指定投影参数时,该读取所返回、状态中保存的实体缺少哪些必需字段——这些实体包括路径中 id 所指的条目,或列出的条目。该类型的任何视图都不再要求这些字段。不检查任何内容的读取——例如在对其目标进行已建模写入仍在运行时开始的读取,或集合已超出其范围的页面——不会记录任何省略。 已确定的省略在分类后续读取和选择之后的写入观察时同样适用,而不仅仅是在序列化最终视图时。完整的 fields=* 读取不会仅因缺少某个已知可选字段而被视为部分读取。
  • 投影读取。 命名了 fields、fields[...]、select 或 $select 且未返回该条目的条目读取,会被排除在身份证明和视图检查之外。视图将其列入 projected_record_ordinals;服务端会以 projection 为原因,对状态中持有的一个实体重放一次调用该工具并命名此类参数;重放显示录制内容,而非已提供的写入。写入门控既不会从提供重放的成功读取中检查或了解写入效果,也不会从命名了此类参数且省略其视图所需字段的读取中检查或了解写入效果;这类读取返回的 400、404 或 410 仍被视为它检查的缺失。 初始状态截止点之后的无身份投影证据也会被保留,但不会将后续值注入初始实体。失败的响应在投影重放捷径之前就被分类,因此投影出的缺失可以确认删除,或与无法解释的消失产生矛盾。 一条只请求部分字段的列表行,若旁边是显示完整实体的行,会以同样方式重放,并且不能证明身份或成员关系;一条以另一种表示形式显示其实体的条目或列表行(扩展或缩减查询)会在查询键将其与视图其他行区分开时重放(projected_query_keys,原因 variant)。只请求部分字段的调用会重放,除非它给出的每个值都是 * 或是某个被检查行给出的值,且没有重放读取给出该值;此类调用重放录制内容,并且不显示已提供的写入。
  • 序列。 序列值可以是 - 分隔的数字组,各组宽度统一且至少两位,但不能是日期、版本或地址。下一个值保留样本的分组和零填充;超出这些分组的数字会前置。之后的创建必须以这种拼写方式记录其值。某个持有的值若数字超出了掩码(如 99-99 之后的 100-00),仅当它是样本对其数字的拼写时才计入,因此重新加载的状态会从该值继续编号。

验收

  • 在 50 个已发布的捕获中,没有任何写入分组被以 non-json 排除;已提供的写入工具从 35 个增加到 39 个;没有写入工具在基线捕获中提供而在此处未提供。
  • 重新录制的 Homebox 捕获中的创建操作已提供服务。
  • 这些捕获中每个已提供的写入工具都适用。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea