tommwq.work/aip

AIP-129 服务器修改的值和默认值

· [tommwq@126.com]
编号 129
原文链接 https://google.aip.dev/129
状态 批准
创建日期 2023-09-20
更新日期 2023-09-20

服务通常为资源的域提供默认值,偶尔也会在返回应答之前对用户输入进行规范化处理。本指南描述了应如何撰写文档记录此类行为,以使接口消费者收益。

指南

单一拥有者域

必须 只有一个拥有者,要么是客户端,要么是服务器。服务器拥有的域 必须 标记成 OUTPUT_ONLY 域行为。所有其他类型的域 必须 被视为客户端所拥有。服务器 必须 尊重所有客户端拥有域的值(或默认值),不能修改它们。

有效值

如果客户端没有设定值,此时服务将分配、生成或计算出一个值。例如客户端创建一个虚拟机,但没有指定静态IP地址。此时将使用动态IP地址分配。

这种类型的域的例子有:

  • 生成的(UUID)
  • 分配的(动态IP地址)
  • 指派的(最新软件包版本)

具备有效值的属性 必须 在API中表示为两个域:

  • 一个可变域,由用户按需要设置,服务器 不得 修改。
  • 一个 OUTPUT_ONLY 域,记录由服务器决定的有效值。

示例:

message VirtualMachine {
  ...
  string ip_address = 4;
  string effective_ip_address = 5 [
    (google.api.field_behavior) = OUTPUT_ONLY
  ]

命名

有效值 必须 以可变域名字前加上 effective_ 前缀命名。

用户设定域

对于用户设定的域,服务应答中的值 必须 与创建或更新请求中提供的值相同。对于字符串域,这意味着返回的值不变,除了一个例外:

  • 如果字符串域包含数据类型注解, 可以 返回值的规范化字符串。

规范化

由服务器进行规范处理的域 必须google.api.field_info 扩展注解。关于这个注解的指南请参考AIP-202。支持的规范格式集有:

  • uuid
  • ipv4
  • ipv6
  • email

域的规范格式 必须 使用 google.api.field_info 注解描述。

理由

服务器修改的值和默认值通常让声明式客户端的开发更加困难。客户端难以判断这些域的期望状态和当前状态是否一致,因为服务器修改和返回值的规则复杂、不透明又不可重复。

使用单一拥有者域的理由

如果域没有单一拥有者,将会导致声明式客户端出现问题。这些客户端可能试图设置那些会被服务器覆写的域,导致客户端进入不断试图纠正状态的死循环。

命名的理由

统一的命名规则对于在多个API和多个域之间识别标准行为非常重要。用户设定值和有效值之间的程序化关联依赖于统一命名。

TODO 规范化的理由

规范化非常重要,它使得服务能够以标准的方式存储和返回值,同时告诉客户端哪些变化在语义上是等价的。

规范化对于允许服务以标准方式存储和返回值非常重要,同时向客户端传达哪些更改在语义上是相同的。在服务端对值进行规范化处理,可以让服务接受广泛的语义等价输入,无需将每个值作为原始字符串处理。返回客户端输入的规范化结果,让客户端可以比较发送和接收的值,比对差异。

例如对于在某个域上接受电子邮件地址的资源,客户端可能以多种格式设定电子邮件地址值。对于电子邮件 ada@example.com ,客户端可能设定为 ADA@example.comaDa@example.comAdA@example.com 。它们在语义上是等价的,都 应当 被服务接受。服务通过改成小写或规范化,将电子邮件地址改成规范格式进行存储和检索。请注意,返回给客户的域的规范化信息不会描述规范化算法自身,而是用于准确判断两值是否等价的的比较方法。

域值处理的理由

对于不能使用规范化的域,声明式客户端将无法识别哪些变化在语义上具有意义。当声明式客户端发送特定值时,要确保服务返回该值,以验证设定否正确。

修订记录

  • 2023-10-31 将状态改为批准。