当前位置: 首页 > news >正文

AIP-155 请求标识

编号155
原文链接AIP-155: Request identification
状态批准
创建日期2019-05-06
更新日期2019-05-06

有时,由用户提供的唯一请求标识对API是有用的。在很多场景下,例如并行处理时排除重复请求、提供安全的重试、或进行审计时都很有用。

请求标识的最重要的目标是提供幂等性保证:允许多次发出同一个请求,而后续调用不会产生任何实际影响。在网络故障时,客户端可以重发请求,服务器可以检测重复的请求,保证请求只被处理一次。

指南

API 可以 在请求消息(包括标准方法请求消息)中添加 string request_id 参数,唯一标识请求。

message CreateBookRequest {
  // The parent resource where this book will be created.
  // Format: publishers/{publisher}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "library.googleapis.com/Book"
    }];

  // The ID to use for the book, which will become the final component of
  // the book's resource name.
  //
  // This value should be 4-63 characters, and valid characters
  // are /[a-z][0-9]-/.
  string book_id = 2 [(google.api.field_behavior) = REQUIRED];

  // The book to create.
  Book book = 3 [(google.api.field_behavior) = REQUIRED];

  // A unique identifier for this request. Restricted to 36 ASCII characters.
  // A random UUID is recommended.
  // This request is only idempotent if a `request_id` is provided.
  string request_id = 4 [(google.api.field_info).format = UUID4];
}
  • 如果提供请求标识, 必须 保证幂等性。
    • 如果检测到重发的请求,服务器 应当 返回之前成功请求的应答,因为客户端很可能没有收到之前的应答。
    • API 可以 可以选择任意合理时长作为请求标识的有效期。
  • request_id 域 必须 包含在适用的请求消息中( 不得 作为资源自身域)。
  • 请求标识 应当 是可选的。
  • 请求标识 应当 支持 UUID,也 可以 要求 UUID 是唯一有效格式。请求标识的格式限制 必须 记录在文档中。
    • 如果以UUID作为请求标识, 必须 添加扩展注解 (google.api.field_info).format = UUID4 。更多信息参考AIP-202。

过时的成功应答

少数情况下,可能无法返回完全相同的成功应答。例如,创建资源的重发请求可能在资源创建和更新之后到达;由于服务往往不保留历史数据,因此不可能返回和之前完全相同的成功应答。

此时,方法 可以 返回资源的当前状态。即允许用反映最新数据的应答代替之前的成功应答。

进一步阅读

  • 关于哪些代码需要重试,请参考AIP-194。
  • 关于客户端库如何在失败时重试,请参考AIP-4221。

理由

使用UUID作为请求标识

在需要唯一值的时候,使用开放格式可能导致API消费者错误的发出重复的标识符。因此,为全局唯一标识符设置规范,可以大大减少程序正常执行时发生冲突的机会。

修订记录

  • 2024-01-08 在请求消息中添加 book_id 。
  • 2023-10-02 添加UUID格式扩展指南。
  • 2019-08-01 将示例从 “shelves” 改为 “publishers”,提供更好的资源所有权示例。

相关文章:

  • 标签使用笔记
  • sqli-lab
  • 【SpringBoot】数据访问技术spring Data、 JDBC、MyBatis、JSR-303校验
  • 使用通义万相Wan2.1进行视频生成
  • 钉钉宜搭智能车辆管理系统:AIoT与低代码融合的数字化解决方案
  • 基于Three.js的3D赛车游戏开发实战详解
  • Vue 3 路由管理实战:构建多页面博客导航 - 掌握 Vue Router 实现 SPA 页面跳转
  • nio多线程版本
  • 【Linux网络编程】五种IO模型 多路转接(select)
  • 第39天:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化
  • java八股文之框架
  • (转)Java单例模式(1)
  • Unity 运用正则表达式保留字符串中的中文英文字母和数字
  • 深入理解 QVectorQString:Qt 中动态数组的强大力量
  • 《机器学习数学基础》补充资料:LU分解
  • linux 命令getent 的使用指南
  • 第五章 数据库完整性
  • 【操作系统】同步与互斥
  • WPF中对滚动条进行平滑滚动
  • Spring Boot 3.x 基于 Redis 实现邮箱验证码认证
  • 专业网站建设开发/百度有几种推广方式
  • 西班牙外贸网站/徐州关键词优化排名
  • 西山区城市建设局网站/seo运营招聘
  • 长春 网站建设/如何做好网络推广工作
  • 建设集团有限公司网站/百度免费推广
  • 怎么做像京东一样的网站/拉新推广赚钱的app