AIP-127 HTTP和gRPC转码

编号127
原文链接AIP-127: HTTP and gRPC Transcoding
状态批准
创建日期2019-08-22
更新日期2019-08-22

遵守面向资源设计的API使用RPC进行定义,但面向资源设计框架允许这些API表现为整体上符合REST/JSON约定的接口。这一点很重要,可以帮助开发者利用现有知识:超过80%的公开API遵守REST约定,开发者已经习惯了这种模式。

指南

API 必须 每个RPC提供HTTP定义,双向流式RPC除外。因为HTTP/1.1无法原生支持双向流式传输。提供双向流式方法的API 应该 提供一个不依赖双向流式传输的备选方法。

HTTP方法和路径

使用protobuf时,每个RPC 必须 使用 google.api.http 注解定义HTTP方法和路径:

rpc CreateBook(CreateBookRequest) returns (Book) {option (google.api.http) = {post: "/v1/{parent=publishers/*}/books"body: "book"};
}message CreateBookRequest {// The publisher who will publish this book.// When using HTTP/JSON, this field is automatically populated based// on the URI, because of the `{parent=publishers/*}` syntax.string parent = 1 [(google.api.field_behavior) = REQUIRED,(google.api.resource_reference) = {child_type: "library.googleapis.com/Book"}];// The book to create.// When using HTTP/JSON, this field is populated based on the HTTP body,// because of the `body: "book"` syntax.Book book = 2 [(google.api.field_behavior) = REQUIRED];// The user-specified ID for the book.// When using HTTP/JSON, this field is populated based on a query string// argument, such as `?bookId=foo`. This is the fallback for fields that// are not included in either the URI or the body.// Note that clients use camelCase format to communicate the field names// to the service.string book_id = 3;
}
  • 第一个键(例子中的 post )对应于HTTP方法。RPC 可以 使用 getpostpatchdelete 方法。
    • RPC 必须 对标准方法使用规范HTTP动词,如AIP-131、AIP-132、AIP-133、AIP-134和AIP-135中讨论的那样。
    • RPC 应该 对自定义方法使用规范HTTP动词,如AIP-136中讨论的那样。
    • RPC 不应该 使用 putcustom
  • 表示URI的值。
    • URI 必须 使用 {foo=bar/*} 语法表示应在请求proto中填充的变量。当捕获资源名字时,变量 必须 包括完整的资源名字,而非仅仅是标识部分。
    • URI 可以 使用嵌套域作为变量名。(还有,AIP-134要求 Update 请求必须这么做。)
    • URI 必须 使用 * 字符来表示标识部分,它匹配除 / 之外的所有URI安全字符。如果需要匹配字符 / ,URI 可以 使用 ** 作为URI的最后一段。
  • body 键定义了请求中将作为HTTP主体发送的单一顶层域。如果主体是 *,表示请求对象自身是HTTP主体。请求主体按照protobuf规范JSON编码生成JSON。
    • 使用 GETDELETE HTTP动词的RPC 不得 定义 body
    • 创建(AIP-133)和更新(AIP-134)请求 必须 使用规定的 body
    • 自定义方法(AIP-136) 应该 使用规定的 body
    • body 不得 包含嵌套域(或使用 . 字符)。
    • body 不得 与URI参数相同。
    • body 不得repeated 域。
    • 不应 使用 json_name 注解改变JSON中的域名字,除非需要向后兼容。

注意: 双向流式RPC不应该包含任何 google.api.http 注解。如果可以,服务 应该 提供等效的非流式RPC。

多URI绑定

有时一个RPC需要对应多个URI:

rpc CreateBook(CreateBookRequest) returns (Book) {option (google.api.http) = {post: "/v1/{parent=publishers/*}/books"body: "book"additional_bindings: {post: "/v1/{parent=authors/*}/books"body: "book"}additional_bindings: {post: "/v1/books"body: "book"}};
}
  • RPC 可以 定义任意数量的附加绑定。附加绑定结构与 google.api.http 注解相同(实际上这是一个递归引用)。
  • RPC 不得 在附加绑定中嵌套定义附加绑定。
  • body 子句 必须 在顶级注解和每个附加绑定中相同。

修订记录

  • 2022-08-18 :添加要求查询字符串参数名字使用camelCase格式的注释。
  • 2021-01-06 :添加对 body 和嵌套域的明确描述。
  • 2019-09-23 :添加关于请求主体编码的陈述,和避免使用 json_name 的指南。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Doris Schema Change 常见问题分析

1. 什么是 Schema Change Schema Change 是在数据库中修改表结构的一种操作,例如添加列、删除列、更改列类型等。 ⚠️Schema Change 限制⚠️ 一张表在同一时间只能有一个 Schema Change 作业在运行。分区列和分桶列不能修改。如果聚合表中有 REPLACE 方式聚合的…

我的2024年年度总结

序言 在前不久(应该是上周)的博客之星入围赛中铩羽而归了。虽然心中颇为不甘,觉得这一年兢兢业业,每天都在发文章,不应该是这样的结果(连前300名都进不了)。但人不能总抱怨,总要向前…

C++ DLL注入原理以及示例

0、 前言 0.1 什么是DLL注入 DLL(动态链接库)注入是一种技术,通过将外部的 DLL 文件强行加载到目标进程的地址空间中,使得外部代码可以执行。这种技术常用于修改或扩展应用程序的行为,甚至用于恶意攻击。 0.2 DLL注入…

MATLAB绘图:随机彩色圆点图

这段代码在MATLAB中生成并绘制了500个随机位置和颜色的散点图。通过随机生成的x和y坐标以及颜色,用户可以直观地观察到随机点的分布。这种可视化方式在数据分析、统计学和随机过程的演示中具有广泛的应用。 文章目录 运行结果代码代码讲解 运行结果 代码 clc; clea…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站,所以突发奇想,在本地装个WordPress玩玩吧,就尝试着装了一下,因为之前电脑上就有MySQL,所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题,也就是启动过…

RabbitMQ 架构分析

文章目录 前言一、RabbitMQ架构分析1、Broker2、Vhost3、Producer4、Messages5、Connections6、Channel7、Exchange7、Queue8、Consumer 二、消息路由机制1、Direct Exchange2、Topic Exchange3、Fanout Exchange4、Headers Exchange5、notice5.1、备用交换机(Alter…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…

routeros7 adguardhome添加规则报错certificate expired

mikrokit routeros 7添加adguardhome容器。 /container/add remote-imageadguard/adguardhome:latest interfaceveth1 root-dircontainer/adgurdhome loggingyes结果发现添加不了规则,报证书过期。 Error: control/filtering/add_url | Couldn’t fetch filter fro…

壁纸设计过程中如何增加氛围感

在壁纸设计过程中,增加氛围感是提升整体视觉效果和情感传达的关键。以下是一些具体的方法和技巧,帮助你在设计中营造出强烈的氛围感: 一、色彩运用 选择主题色: 根据你想要传达的情感选择主色调。例如,温暖的色调&…

RabbitMQ模块新增消息转换器

文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

2024年度总结:技术探索与个人成长的交织

文章目录 前言年度创作回顾&#xff1a;技术深耕与分享数据库技术&#xff1a;MySQL 与 MyBatisJava 及相关技术栈计算机网络&#xff1a;构建网络知识体系思维方式的转变&#xff1a;构建技术知识体系的桥梁 项目实践&#xff1a;人工智能与智慧医疗的碰撞生活与博客的融合与平…

python:taichi 模拟一维波场

在 Taichi 中模拟一维波场&#xff0c;通常是利用 Taichi 编程语言的特性来对一维空间中的波动现象进行数值模拟&#xff0c;以下是相关介绍&#xff1a; 原理基础 波动方程&#xff1a;一维波动方程的一般形式为 &#xff0c;其中 u(x,t) 表示在位置x 和时间t 处的波的状态&…

基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真。选择回归法进行最大功率点的追踪&#xff0c;使用光强和温度作为影响因素&#xff0c;电压作为输出进行建模。…

深入MapReduce——引入

引入 前面我们已经深入了HDFS的设计与实现&#xff0c;对于分布式系统也有了不错的理解。 但HDFS仅仅解决了海量数据存储和读写的问题。要想让数据产生价值&#xff0c;一定是需要从数据中挖掘出价值才行&#xff0c;这就需要我们拥有海量数据的计算处理能力。 下面我们还是…

Vue 引入及简单示例

Vue 渐进式JavaScript 框架 学习笔记 - Vue 引入及简单示例 目录 与jquery区别 Vue引入 两种方式引入 下载到本地 代码结构 简单示例 Style中引入vue.js 对vue语法进行解析 对三目运算符支持 设置变量&#xff08;状态&#xff09; 总结 与jquery区别 不需要手动操…

系统思考—问题分析

很多中小企业都在面对转型的难题&#xff1a;市场变化快&#xff0c;资源有限&#xff0c;团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时&#xff0c;他提到&#xff1a;“我们团队每天都很忙&#xff0c;但效率始终没见提升&#xff0c;感觉像是在…

π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法

Chelsea Finn引领的Physical Intelligence公司&#xff0c;专注于打造先进的机器人大模型&#xff0c;近日迎来了一个令人振奋的里程碑。在短短不到一年的时间内&#xff0c;该公司成功推出了他们的首个演示版本。这一成就不仅展示了团队的卓越技术实力&#xff0c;也预示着机器…

第二十一周:Mask R-CNN

Mask R-CNN 摘要Abstract文章信息研究动机Mask RCNNRoIPool与RoIAlign 双线性插值Mask Branch(FCN)其他细节Mask RCNN损失Mask分支预测 网络搭建创新点与不足总结 摘要 本篇博客介绍了Mask R-CNN&#xff0c;这是一种用于实例分割的模型&#xff0c;能够在目标检测的基础上实现…

Windows本地部署(DeepSeek-R1-Distill-Qwen-1.5B)模型

文章目录 Windows本地部署&#xff08;DeepSeek-R1-Distill-Qwen-1.5B&#xff09;模型本机环境运行环境安装安装 WSL2&#xff0c;启用linux 系统进入linux 系统后&#xff0c;安装以下软件安装 Anaconda3安装 CUDA安装 pip创建虚拟环境并安装 vllm 模型下载模型运行部署模型测…

Java 大视界 -- Java 大数据在元宇宙中的关键技术与应用场景(65)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…