AIP-134 标准方法:Update

news2025/2/2 11:14:59
编号134
原文链接AIP-134: Standard methods: Update
状态批准
创建日期2019-01-24
更新日期2022-06-02

REST API通常向资源URI(如 /v1/publishers/{publisher}/books/{book} )发出 PATCHPUT 请求,更新资源。

面向资源设计(AIP-121)提供Update方法(类似REST PATCH行为),遵循这一模式。这些接口接受代表资源的URI,返回资源。

指南

API通常 应当 为资源提供Update方法,除非对用户没实际意义。Update方法的目的是修改资源,而不引发副作用。

Update方法使用以下模式:

rpc UpdateBook(UpdateBookRequest) returns (Book) {
  option (google.api.http) = {
    patch: "/v1/{book.name=publishers/*/books/*}"
    body: "book"
  };
  option (google.api.method_signature) = "book,update_mask";
}
  • 接口名字 必须 以单词Update开头,其余部分 应当 是资源消息名字的单数形式。
  • 请求消息 必须 与接口名字一致,并带有 Request 后缀。
  • 应答消息必须是资源本身。(不存在 UpdateBookResponse 。)
    • 应答 应当 包含完整资源数据, 必须 包含客户端发送的全部域,并在域掩码中包含这些域。除非它们是仅输入域(参考AIP-203)。
    • 如果Update接口是耗时更新,应答消息 必须 google.longrunning.Operation ,解析为资源自身。
  • 方法 应当 支持更新部分资源,对应HTTP动词是 PATCH
    • 如果方法仅支持完全资源替换,HTTP动词 可以PUT 。然而非常不建议这样做,这导致向资源添加新域的变更无法向后兼容。
  • 资源的 name应当 映射到URI路径。
    • {resource}.name应当 是URI路径中唯一的变量。
  • google.api.http 注解中 必须 包含 body 键, 必须 映射到请求消息中的资源域。
    • 所有其他域 应当 映射到URI查询参数。
  • 应当 只有一个 google.api.method_signature 注解,值为 "{resource},update_mask"
  • 如果API在管理平面上运行,操作应该具有强一致性:更新操作完成时,所有用户可设定值和资源的存在性 必须 达到稳定状态,读取资源状态将返回一致的应答。

#+begin_quote

注意:* 与其他四个标准方法不同,这里的URI路径引用了示例中的嵌套域( book.name )。如果资源域存在单词分隔符,使用 snake_case

#+end_quote

请求消息

Update方法实现了常见的请求消息模式:

message UpdateBookRequest {
  // The book to update.
  //
  // The book's `name` field is used to identify the book to update.
  // Format: publishers/{publisher}/books/{book}
  Book book = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to update.
  google.protobuf.FieldMask update_mask = 2;
}
  • 请求消息 必须 包含表示资源的域。
    • 必须 映射到 PATCH 主体。
    • 应当 注释为必需域。
    • 资源消息 必须 包含 name 域。
    • name必须 标识需要更新的资源的类型。
  • 如果允许更新部分资源, 必须 包含域掩码。 必须google.protobuf.FieldMask 类型, 必须 称为 update_mask
    • 域掩码中包含的域对应于欲更新资源(而非请求消息)。
    • 必须 是可选的,服务 必须 将缺失的域掩码视为等同于包含了所有域的域掩码。
    • 更新掩码 必须 支持特殊值 * ,表示完全替换资源(等同于 PUT )。
      • API生产者在向资源添加新的可变域时,需要注意消费者在不知道新可变域的情况下是如何处理通配符( * )的。同样地,消费者只有风险可控的条件下才使用通配符。通常而言,最安全的做法是明确指定要更新的域,而非通配符( * )。
  • 请求消息 不得 包含任何其他必需域, 不应 包含其他可选域,除非本AIP或其他AIP有要求。

副作用

通常,Update方法的目标是更新资源中的数据。Update方法 不应 引发其他副作用。相反,副作用 应当 通过自定义方法触发。

特别的,这意味着在Update方法中,状态域不可以直接修改。

PATCHPUT

概要: Google API通常只使用HTTP动词 PATCH ,不支持 PUT 请求。

Google统一使用 PATCH ,因为在变更稳定API时提升了向后兼容性。常常需要向现有资源添加新域,但在使用 PUT 时,这会成为破坏性变更。

为了说明这一点,考虑对 Book 资源的 PUT 请求:

PUT /v1/publishers/123/books/456

{"title": "Mary Poppins", "author": "P.L. Travers"}

接下来考虑资源后来增加了一个新域(这里添加了 rating ):

message Book {
  string title = 1;
  string author = 2;

  // Subsequently added to v1 in place...
  int32 rating = 3;
}

如果一个图书资源设置了评分,然后执行了旧版本的 PUT 请求,将清除图书评分信息。本质上 PUT 请求无意中清除了数据,因为旧版本不知道这个域。

耗时更新

某些资源在更新时需要的时间比常规API应答时间更长。此时API应使用耗时操作(AIP-151)模式:

rpc UpdateBook(UpdateBookRequest) returns (google.longrunning.Operation) {
  option (google.api.http) = {
    patch: "/v1/{book.name=publishers/*/books/*}"
    body: "book"
  };
  option (google.longrunning.operation_info) = {
    response_type: "Book"
    metadata_type: "OperationMetadata"
  };
}
  • 应答类型 必须 设置为资源(如果接口不是耗时操作,返回类型会是什么)。
  • 必须 设定 response_typemetadata_type 域。

#+begin_quote

注意:* 声明友好资源(AIP-128) 应当 使用耗时更新。

#+end_quote

Create或Update

如果服务使用客户端分配的资源名字,Update方法 可以 提供 bool allow_missing 域,让方法允许用户更新一个不存在的资源(在处理过程中创建资源):

message UpdateBookRequest {
  // The book to update.
  //
  // The book's `name` field is used to identify the book to be updated.
  // Format: publishers/{publisher}/books/{book}
  Book book = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to be updated.
  google.protobuf.FieldMask update_mask = 2;

  // If set to true, and the book is not found, a new book will be created.
  // In this situation, `update_mask` is ignored.
  bool allow_missing = 3;
}

更具体地说, allow_missing 标志引发以下行为:

  • 如果方法在一个不存在的资源上调用,创建资源。设定所有请求中包含的域,无论是否出现在域掩码中。
    • 如果缺少必需域或域值无效,返回 INVALID_ARGUMENT 错误。
  • 如果方法在已存在的资源上调用,并且所有域值一致,返回未修改的现存资源。
  • 如果方法在已存在的资源上调用,只更新域掩码中声明的域。

用户 必须 拥有更新权限才能调用Update,即使将 allow_missing 设置为 true 。对于希望防止用户通过Update方法创建资源的API, 应当 使用IAM(身份和访问管理)条件。

Etags

API有时需要允许用户发送Update请求,请求需要保证应用到最新数据上(常见的使用场景是为了检测和避免竞态条件)。需要启用这个功能的资源要包含 string etag 域,包含一个由服务器计算的、代表资源内容的密值。

此时资源 应当 包含 string etag 域:

message Book {
  option (google.api.resource) = {
    type: "library.googleapis.com/Book"
    pattern: "publishers/{publisher}/books/{book}"
  };

  // The resource name of the book.
  // Format: publishers/{publisher}/books/{book}
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // The title of the book.
  // Example: "Mary Poppins"
  string title = 2;

  // The author of the book.
  // Example: "P.L. Travers"
  string author = 3;

  // The etag for this book.
  // If this is provided on update, it must match the server's etag.
  string etag = 4;
}

etag可以 是必须域或可选域。如果设定了 etag 域,只有当值与服务器计算结果匹配时,请求才能成功。否则 必须 返回 ABORTED 错误。请求中的 update_mask 域不会影响 etag 域的行为,因为不是一个 需要 更新的域。

高成本域

API有时会遇到这种情况:资源中某些域的计算成本很高,或者根本无法返回可靠值。

这可能发生在以下几种场景:

  • 资源中可能有一些域的计算成本非常高,并且通常在Update请求中对客户没用。
  • 单一资源有时用来表示来自多个底层(最终一致的)数据源的数据的汇总。此时无法返回那些未修改域的准确信息。

在这种情况下,API 可以 只返回已更新域,省略其他。如果这样做, 应当 用文档记录这种行为。

错误

参考错误,特别是何时使用PERMISSION_DENIED和NOT_FOUND错误。

此外,如果用户确实拥有适当权限,但请求的资源不存在,服务 必须 返回 NOT_FOUND (HTTP 404)错误, allow_missing 设定为 true 时除外。

修订记录

  • 2024-12-03 添加使用完整替换域掩码的注意事项。
  • 2024-03-14update_mask 域的可选行为指南改为 必须
  • 2023-08-26 添加一致性要求。
  • 2023-07-17update_mask 域名字指南改为 必须
  • 2022-11-04 将错误指南汇总到AIP-193。
  • 2022-06-02 修改后缀描述,消除多余的“-”。
  • 2021-11-04 修改设定 allow_missing 时的权限检查。
  • 2021-07-08 添加资源未找到场景的错误指南。
  • 2021-03-05etag 错误从 FAILED_PRECONDITION (即HTTP 400)改为 ABORTED (409)。
  • 2020-10-06 添加声明友好资源指南。
  • 2020-10-06 添加 allow_missing 指南。
  • 2020-08-14 添加权限拒绝场景错误指南。
  • 2020-06-08 添加返回完整资源数据的指南。
  • 2019-10-18 添加注释指南。
  • 2019-09-10 添加耗时操作AIP链接(AIP-151)。
  • 2019-08-01 将示例从“shelves”改为“publishers”,提供更好的资源所有权示例。
  • 2019-06-10 添加耗时更新指南。
  • 2019-05-29 添加禁止在标准方法中使用任意域的明确禁令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2289749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析,目前还处于陆续不断更新地更新过程中,为大佬的专业和开源贡献精神点赞。先收藏链接,后续慢慢学习。 相关链接如下: DIFY源码解析

hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题

Hexo 部署博客到 GitHub page 后,可以在 setting 中的 page 中绑定自己的域名,但是我发现更新博客后绑定的域名消失,恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件,内容为 page 里面绑定的域名&…

【Block总结】MAB,多尺度注意力块|即插即用

文章目录 一、论文信息二、创新点三、方法MAB模块解读1、MAB模块概述2、MAB模块组成3、MAB模块的优势 四、效果五、实验结果六、总结代码 一、论文信息 标题: Multi-scale Attention Network for Single Image Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguan…

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快,移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙,用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求,无需下载安装,随时可用&…

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI,是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手,感觉收获还蛮多的,今天来分享下开发过程中的一些经验~ 为啥要做这个…

攻防世界_simple_php

同类型题(更难版->)攻防世界_Web(easyphp)(php代码审计/json格式/php弱类型匹配) php代码审计 show_source(__FILE__):show_source() 函数用于显示指定文件的源代码,并进行语法高亮显示。__FILE__ 是魔…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法(了解)2.2全域散列法(了解) 3.处理哈希冲突3.1线性探测(挨着找)3.2二次探测(跳…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关): 提供服务路由能力提供各种拦截支持 1、分布式网关推荐 建议使用专业的分布式网关产品&#xff0…

dmfldr实战

dmfldr实战 本文使用达梦的快速装载工具,对测试表进行数据导入导出。 新建测试表 create table “BENCHMARK”.“TEST_FLDR” ( “uid” INTEGER identity(1, 1) not null , “name” VARCHAR(24), “begin_date” TIMESTAMP(0), “amount” DECIMAL(6, 2), prim…

Spring AOP 入门教程:基础概念与实现

目录 第一章:AOP概念的引入 第二章:AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章:Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…

Upscayl-官方开源免费图像AI增强软件

upscayl 链接:https://pan.xunlei.com/s/VOI0Szqe0fCwSSUSS8zRqKf7A1?pwdhefi#

SpringBoot Web开发(SpringMVC)

SpringBoot Web开发(SpringMVC) MVC 核心组件和调用流程 Spring MVC与许多其他Web框架一样,是围绕前端控制器模式设计的,其中中央 Servlet DispatcherServlet 做整体请求处理调度! . 除了DispatcherServletSpringMVC还会提供其他…

苍穹外卖第一天

角色分工 技术选型 pojo子模块 nginx反向代理 MD5密码加密

C# Winform enter键怎么去关联button

1.关联按钮上的Key事件按钮上的keypress,keydown,keyup事件随便一个即可private void textBox1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode Keys.Enter){this.textBox2.Focus();}}2.窗体上的事件private void textBox2_KeyPress(object sen…

LeGO LOAM坐标系问题的自我思考

LeGO LOAM坐标系问题的自我思考 IMU坐标系LeGO LOAM代码分析代码 对于IMU输出测量值的integration积分过程欧拉角的旋转矩阵VeloToStartIMU()函数TransformToStartIMU(PointType *p) IMU坐标系 在LeGO LOAM中IMU坐标系的形式采用前(x)-左(y)-上(z)的形式,IMU坐标系…

vim交换文件的作用

1.数据恢复:因为vim异常的退出,使用交换文件可以恢复之前的修改内容。 2.防止多人同时编辑:vim检测到交换文件的存在,会给出提示,以避免一个文件同时被多人编辑。 (vim交换文件的工作原理:vim交换文件的工作…

PHP实现混合加密方式,提高加密的安全性(代码解密)

代码1&#xff1a; <?php // 需要加密的内容 $plaintext 授权服务器拒绝连接;// 1. AES加密部分 $aesKey openssl_random_pseudo_bytes(32); // 生成256位AES密钥 $iv openssl_random_pseudo_bytes(16); // 生成128位IV// AES加密&#xff08;CBC模式&#xff09…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…

(9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同

&#xff08;1&#xff09;经过之前的学习。俺认为结论是这样的&#xff0c;因为三次握手到四次挥手&#xff0c;到 RST 报文&#xff0c;都是 tcp 连接上收到了报文&#xff0c;这都属于读事件。所以&#xff1a; EPOLLIN : 包含了读事件&#xff0c; FIN 报文的正常四次挥手、…

因果推断与机器学习—用机器学习解决因果推断问题

Judea Pearl 将当前备受瞩目的机器学习研究戏谑地称为“仅限于曲线拟合”,然而,曲线拟合的实现绝非易事。机器学习模型在图像识别、语音识别、自然语言处理、蛋白质分子结构预测以及搜索推荐等多个领域均展现出显著的应用效果。 在因果推断任务中,在完成因果效应识别之后,需…