google.api.http

2023-11-18

Http

定义api服务的http配置。它包含一个httprule列表,每个列表指定一个rpc方法到一个或多个http rest api方法的映射。

字段 描述
rules[] HttpRule, 一个适用于各个API方法的http配置规则列表。注意:所有服务配置规则都遵循“最后一个配置赢”规则。
fully_decode_reserved_expansion bool, 当设置为true时,除了保留扩展中的单个段匹配的情况下,url路径参数将完全进行url解码,其中“%2f”将保留编码。默认行为是不解码多段匹配中的rfc 6570保留字符。

URL特殊符号编码

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码。
编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如: 空格的编码值是”%20”。
如果不使用转义字符,这些编码就会当URL中定义的特殊字符处理。

URL特殊符号 含义 编码十六进制值
+ 空格 %2B
空格 空格可以用+号或者编码%20 %20
/ 分隔目录和子目录 %2F
? 分隔实际的 URL 和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& 指定的参数间的分隔符 %26
= 指定参数的值 %3D

HttpRule

httprule定义了一个rpc方法到一个或多个http rest API方法的映射。映射指定rpc请求消息的不同部分如何映射到url路径,url查询参数和http请求主体。通常可在rpc方法中指定google.api.http注释来表示该映射,有关详细信息,请参阅“google/api/annotations.proto”。

该映射由指定路径模板和方法类型的字段组成。路径模板可以引用请求消息中的字段,如下面的示例中描述对消息资源集合的REST GET操作:

service Messaging {
  rpc GetMessage(GetMessageRequest) returns (Message) {
    option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
  }
}
message GetMessageRequest {
  message SubMessage {
    string subfield = 1;
  }
  string message_id = 1; // mapped to the URL
  SubMessage sub = 2;    // `sub.subfield` is url-mapped
}
message Message {
  string text = 1; // content of the resource
}

也可以在GRPC API Configuration yaml文件中表达相同的http注释。

http:
  rules:
    - selector: <proto_package_name>.Messaging.GetMessage
      get: /v1/messages/{message_id}/{sub.subfield}

这个定义启用了http json到rpc的自动,双向映射。例:

HTTP RPC
GET /v1/messages/123456/foo GetMessage(message_id: “123456” sub: SubMessage(subfield: “foo”))

通常,不仅可以从路径模式中引用字段,还可以引用字段路径。映射到路径模式的字段不能重复,并且必须具有原始(非消息)类型。

请求消息中未被路径模式绑定的任何字段自动成为(可选)http查询参数。

假定请求消息的以下定义:

service Messaging {
  rpc GetMessage(GetMessageRequest) returns (Message) {
    option (google.api.http).get = "/v1/messages/{message_id}";
  }
}
message GetMessageRequest {
  message SubMessage {
    string subfield = 1;
  }
  string message_id = 1; // mapped to the URL
  int64 revision = 2;    // becomes a parameter
  SubMessage sub = 3;    // `sub.subfield` becomes a parameter
}

这使得http json到rpc的映射如下:

HTTP RPC
GET /v1/messages/123456?revision=2&sub.subfield=foo GetMessage(message_id: “123456” revision: 2 sub: SubMessage(subfield: “foo”))

请注意,映射到http参数的字段必须具有基元类型或重复基元类型。消息类型是不允许的。在重复类型的情况下,该参数可以在url中重复,如...?param=a&param=b

对于允许请求主体的http方法种类,body字段可以在映射中指定。考虑在消息资源集合上的REST Update方法:

service Messaging {
  rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
    option (google.api.http) = {
      put: "/v1/messages/{message_id}"
      body: "message"
    };
  }
}
message UpdateMessageRequest {
  string message_id = 1; // mapped to the URL
  Message message = 2;   // mapped to the body
}

下面的http json到rpc映射被启用,其中请求主体中json的表示由protos json编码确定:

HTTP RPC
PUT /v1/messages/123456 { “text”: “Hi!” } UpdateMessage(message_id: “123456” message { text: “Hi!” })

可以在主体映射中使用特殊名称*来定义未被路径模板限制的每个字段都应映射到请求主体。这使更新方法的以下备选定义成为可能:

service Messaging {
  rpc UpdateMessage(Message) returns (Message) {
    option (google.api.http) = {
      put: "/v1/messages/{message_id}"
      body: "*"
    };
  }
}
message Message {
  string message_id = 1;
  string text = 2;
}

下面的http json到rpc映射被启用:

HTTP RPC
PUT /v1/messages/123456 { “text”: “Hi!” } UpdateMessage(message_id: “123456” text: “Hi!”)

请注意,在正文映射中使用*时,不可能使用http参数,因为所有未在路径上绑定的字段都在body中。这使得这个选项很少被用于定义REST apis的实践。*的常见用法是在自定义方法中根本不会使用url参数来传输数据。

可以使用additional_bindings选项为一个rpc定义多个http方法。例:

service Messaging {
  rpc GetMessage(GetMessageRequest) returns (Message) {
    option (google.api.http) = {
      get: "/v1/messages/{message_id}"
      additional_bindings {
        get: "/v1/users/{user_id}/messages/{message_id}"
      }
    };
  }
}
message GetMessageRequest {
  string message_id = 1;
  string user_id = 2;
}

这使得以下两种替代http json到rpc映射成为可能:

HTTP RPC
GET /v1/messages/123456 GetMessage(message_id: “123456”)
GET /v1/users/me/messages/123456 GetMessage(user_id: “me” message_id: “123456”)

http映射规则

将http路径,查询参数和主体字段映射到请求消息的规则如下:

  1. body字段指定*或字段路径,或省略。如果省略,则表示没有http请求体。
  2. 叶子字段(请求中嵌套消息的递归扩展)可以分为三种类型:
    a. 在url模板中匹配。
    b. 由body覆盖(如果body*,除(a)字段外的所有字段; 否则一切由body标明的字段)
    c. 所有其他字段。
  3. 在http请求中找到的url查询参数被映射到(c)字段(未在url模板中匹配,不包含body之外的所有其他字段)。
  4. 任何使用http请求发送的body只能包含(b)字段。

路径模板的语法如下所示:

Template = "/" Segments [ Verb ] ;
Segments = Segment { "/" Segment } ;
Segment  = "*" | "**" | LITERAL | Variable ;
Variable = "{" FieldPath [ "=" Segments ] "}" ;
FieldPath = IDENT { "." IDENT } ;
Verb     = ":" LITERAL ;

语法*匹配单个路径段。语法**匹配零个或多个路径段,它必须是除Verb之外的路径的最后部分。语法LITERAL与路径中的文本文字相匹配。

语法Variable匹配由其模板指定的url路径的一部分。一个变量模板不能包含其他变量。如果变量与单个路径段匹配,则其模板可以省略,例如: {var}相当于{var = *}

如果一个变量恰好包含一个路径段,如“{var}”“{var = *}”,当这样一个变量扩展为一个url路径时,除了[-_.〜0-9a-za-z]之外的所有字符都是百分比编码的。这些变量在发现文档中显示为{var}

如果变量包含一个或多个路径段,如“{var = foo / *}”“{var = **}”, 当这样一个变量扩展为一个url路径时,除了[-_.〜/0-9a-za-z]之外的所有字符都是百分比编码的。这些变量在发现文档中显示为{+var}

注意:虽然单段变量匹配RFC 6570第3.2.2节简单字符串扩展的语义,但多段变量不匹配RFC 6570保留扩展。原因是保留扩展不会扩展特殊字符,这将导致无效的网址。

注意:变量和正文中的字段路径不得引用重复的字段或映射字段。

原文链接: google.api.http

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

google.api.http 的相关文章

随机推荐

  • Linux常见命令整理

    Linux 常用命令 基本命令掌握 磁盘命令 cd ll 文件夹 文件创建命令 mkdir touch 文件浏览 less 文件全盘查找 find 文件操作 cp mv rm 文件编辑 vi 压缩解压 tar 权限命令 其它命令 最终 安装
  • [Qt3d] 导出QtEntity为Obj格式(遍历QtEntity)

    原文链接 https www yuque com softdev qt txv1lx class Qui3DView private struct date struct QPointer
  • java.awt.Color类

    Color类概述 Color是用来封装颜色的 支持多种颜色空间 默认为RGB颜色空间 每个Color对象都有一个alpha通道 值为0到255 代表透明度 当alpha通道值为255时 表示完全不透明 当alpha通道值为0时 表示完全透明
  • Cordova环境搭建/win10下必备依赖环境配置(Android开发)

    Cordova环境依赖 1 win10系统 2 Java环境 3 Node环境 4 AndroidStudio 5 Ant 6 Gradle 安装node环境 1 使用node官网网址下载node包 最好使用稳定版本 https nodej
  • 从C过渡到C ++的3个理由

    几十年来 嵌入式软件工程师之间一直在争论他们应该使用C还是C 根据2020年嵌入式市场调查 在大多数情况下 微控制器制造商提供的软件都以C语言提供 实际上 有56 的嵌入式软件是用C语言编写的 但是 C 逐渐流行起来 大约23 的新嵌入式软
  • Java面向对象编程

    主机甲和乙已建立了TCP连接 甲始终以MSS 1KB大小的段发送数据 并一直有数据发送 乙每收到一个数据段都会发出一个接收窗口为10KB的确认段 若甲在t时刻发生超时时拥塞窗口为8KB 则从t时刻起 不再发生超时的情况下 经过10个RTT后
  • Ubuntu安装git

    使用 apt get install git 安装git 报错 这个错误信息通常表示您的系统上没有可用的 git 软件包 这可能是因为您的软件源列表中没有包含 git 软件包所在的软件源 或者您的软件源列表已经过期 解决 如果您使用的是 U
  • RuntimeError: Attempting to deserialize object on CUDA device 1 but torch.cuda.device_count() is 1.

    成功解决 RuntimeError Attempting to deserialize object on CUDA device 1 but torch cuda device count is 1 报错内容 程序在这一步报错 check
  • Android kotlin自定义自动换行LinearLayout

    目录 1 概述 2 实现步骤 3 kotlin自定义自动换行LinearLayout核心代码实现功能 3 1自定义LinearLayout
  • spring快速入门

    1 导入坐标
  • stack容器

    stack容器 1 stack 基本概念 概念 stack是一种先进后出 First In Last Out FILO 的数据结构 它只有一个出口 栈中只有顶端的元素才可以被外界使用 因此栈不允许有遍历行为 栈中进入数据称为 入栈 push
  • dll load failed: 找不到指定的模块_【已解决】“由于找不到xinput1_3.dll,无法继续执行代码”...

    许多小伙伴在玩游戏或者使用电脑的过程中 电脑突然提示 由于找不到xinput1 3 dll 无法继续执行代码 导致游戏等程序无法正常启动运行 并且导致电脑系统弹窗报错 那xinput1 3 dll丢失怎么修复呢 下面让小编手把手教你解决方法
  • CentOS7安装OpenStack(Liberty)

    1 安装yum源 yum install https buildlogs centos org centos 7 cloud x86 64 openstack liberty centos release openstack liberty
  • 百度智能云千帆大模型三连击:接入LLaMA2等33个模型、上线插件功能和103个Prompt模板

    作为全球首个一站式企业级大模型平台 百度智能云 千帆大模型平台 在提供包括文心一言在内的大模型服务及第三方大模型服务的同时 还提供大模型开发和应用的整套工具链 帮助企业解决大模型从训练到开发过程中的全链条问题 自2023年3月发布以来 千帆
  • 看懂android中的adapter适配器

    首先需要知道一共有4个文件 fragment类 adapter fragment的布局文件 adapter中的item的布局文件 1 首先声明一个控件 RecyclerView 2 然后声明一个adapter类 3 在initView 上
  • python中typeerror_详解python中的TypeError错误解决办法

    新手在学习python时候 会遇到很多的坑 下面来具体说说其中一个 在使用python编写面向对象的程序时 新手可能遇到TypeError this constructor takes no arguments这个错误 例如下面的程序 cl
  • gtest 单元测试工具的基本使用

    gtest 单元测试 gtest 简介 gtest 优点 安装 gtest 测试 demo 总结 gtest 简介 gtest是Google的一套用于编写C 测试的框架 可以运行在很多平台上 包括Linux Mac OS X Windows
  • 获取时间和脸颊、下颚线灯模式

    电流检测的应用 电路检测电路常用于 高压短路保护 电机控制 DC DC换流器 系统功耗管理 二次电池的电流管理 蓄电池管理等电流检测等场景 对于大部分应用 都是通过感测电阻两端的压降测量电流 一般使用电流通过时的压降为数十mV 数百mV的电
  • android动画内存优化,Android 性能优化之内存优化

    定义 内存泄漏 Memory Leak 指 程序在申请内存后 当该内存不需再使用但却无法被释放的现象 内存溢出 OOM 应用程序所需的内存超出了为其分配的内存限额 Android将进程分为5个优先等级 前台进程 可见进程 服务进程 后台进程
  • google.api.http

    Http 定义api服务的http配置 它包含一个httprule列表 每个列表指定一个rpc方法到一个或多个http rest api方法的映射 字段 描述 rules HttpRule 一个适用于各个API方法的http配置规则列表 注