AIP-122 资源名字

编号122
原文链接AIP-122: Resource names
状态批准
创建日期2019-01-26
更新日期2019-01-26

大多数API会发布 资源/(主要是名词),用户可以创建、检索和操作这些资源。此外,资源是 /具命的 :每个资源都有唯一的标识符,用户使用标识符引用资源。用户应当将这些名字作为资源的规范名字 存储 。

指南

API资源名字 必须 在API内唯一。(有关跨API引用资源的信息,请参考下面的完整资源名字部分。)

资源名字的格式遵守URI路径模式,但没有前导斜杠:

publishers/123/books/les-miserables users/vhugo1802

  • 资源名字的组成部分 应当 通常从集合标识符(例如: publishers 、 books 、 users )和资源标识符(例如: 123 、 les-miserables 、 vhugo1802 )之间选择。
  • 资源名字 必须 使用 / 字符来分隔资源名字的各个部分。
    • 资源名字的非终结部分 不得 包含 / 字符。
    • 资源名字的终结部分 不应 包含 / 字符。
  • 资源名字 应当 仅使用DNS名字中可用的字符,如RFC-1123定义。
    • 此外,资源标识 不应 使用大写字母。
    • 如果需要额外的字符,资源名字 不应 使用需要URL转义的字符或ASCII之外的字符。
    • 如果无法避免Unicode字符,资源名字 必须 以Unicode规范形式C存储(参考AIP-210)。
  • 资源 必须 发布一个包含资源名字的 name 域。
    • 资源 可以 将资源标识作为单独的域提供(例如 book_id )。这个域 必须 属于仅输出域行为类别。
    • 资源 可以 发布一个单独的、系统生成的唯一标识域(uid) 。这个域 必须 属于仅输出域行为类别。
    • 资源 不得 发布元组、自链接或其他形式的资源标识。
    • 所有标识域都 应当 是字符串。

注意: 此处描述的资源名字在单个API范围内使用(或者在从上下文可以确定拥有资源的API的情况下),并且只在范围内是唯一的。因此它们也被称为 相对资源名字 ,以区别于 完整资源名字 (下面讨论)。

集合标识符

资源名字中的集合标识符部分 必须 是资源名词的复数形式。(例如, Publisher 集合的资源名字是 publishers 。)

  • 集合标识符 必须 是简洁的美式英语词汇。
  • 集合标识符 必须 使用驼峰( camelCase )命名方式。
  • 集合标识符 必须 以小写字母开头,只包含ASCII字母和数字( /[a-z][a-zA-Z0-9]*/ )。
  • 集合标识符 必须 是复数形式。
    • 在没有复数形式的情况下(如“info”),或者单数和复数形式相同的情况下(如“moose”),使用非复数形式(单数形式)是准确的。集合部分 不得 在这种情况下通过添加“s”来“捏造”新词汇(例如避免使用“infos”)。
  • 在任何给定的单一资源名字中,集合标识符 必须 是唯一的。(例如, people/xyz/people/abc 是无效的)
内嵌集合

如果资源名字包含多个层次结构,并且上级资源集合的名字用作下级资源名字的前缀,那么下级资源集合的名字 可以 省略前缀。例如嵌套在 users 下的 UserEvent 资源集合:

users/vhugo1802/userEvents/birthday-dinner-226

API 应当 使用较少冗余的形式:

users/vhugo1802/events/birthday-dinner-226

此时 消息 和 资源类型 仍然是 UserEvent ;只有URI路径模式中集合和资源标识符被简化了。由于 资源类型 没有简化, singular 和 plural 同样 不要简化 。

message UserEvent {option (google.api.resource) = {type: "example.googleapis.com/UserEvent"// Only the collection & resource identfiers in the `pattern` are shortened.pattern: "projects/{project}/users/{user}/events/{event}"singular: "userEvent"plural: "userEvents"};string name = 1;
}

注意: 希望这么做的API 必须 在所有 pattern 中,以及API中引用资源的任何地方统一遵守这个格式。

资源标识段

资源标识段在上级集合中标识资源。在资源名字 publishers/123/books/les-miserables 中, 123 是发布者的资源标识, les-miserables 是书籍的资源标识。

  • 如果资源标识是用户设定的,API 必须 在文档中记录所支持的格式。用户设定的资源标识 应当 符合RFC-1034;该标准要求名字使用字母、数字和连字符,首字符为字母,尾字符为字母或数字,且最大长度为63个字符。
    • 此外,用户设定的资源标识 应当 将字母限制为小写( ^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$ )。
    • 不应 使用ASCII之外的字符;然而如果必须使用Unicode字符,API 必须 遵循AIP-210中的指南。
    • 不应 使用UUID(或任何在语法上看起来像UUID的值)作为用户设定标识符。
  • 如果资源标识不可由用户设置,API 应当 在文档中记录基本格式和长度限制(例如“最多63个字符”)。
  • 了解更多信息,参考CREATE标准方法。

资源标识别名

有时为常用查找模式提供资源标识别名是值得的。例如在其资源层次结构顶部带有 users 的API可能希望提供 users/me ,作为查询认证用户信息的快捷方式。

API 可以 为常用查找模式提供可编程的别名。但是,API返回的所有数据 必须 使用规范资源名字。

完整资源名字

在大多数情况下,资源名字仅在单个API中使用,或者用在所属API明确的上下文中(例如 string pubsub_topic )。

然而,有时服务需要引用任意API中的资源。此时服务 应当 使用 完整资源名字 ,这是一个无模式的URI,包含所属API服务名字,后接相对资源名字:

//library.googleapis.com/publishers/123/books/les-miserables
//calendar.googleapis.com/users/vhugo1802

注意: 完整资源名字 不应 用于所属API明确的跨API引用;只有当域引用多个API中的资源,并且可能存在歧义时使用。

资源URI

完整资源名字是一个无模式的URI,但与用于访问资源的完整URI略有不同。后者包括协议(HTTPS)、API版本和特定的服务端点:

https://library.googleapis.com/v1/publishers/123/books/les-miserables https://calendar.googleapis.com/v3/users/vhugo1802

完整资源名字不包含版本,它被设计成在不同版本之间保持不变。即使API接口可能在主要版本之间发生变化,同一API的多个主要版本通常使用相同的底层数据。

注意: 完整资源名字与服务端点之间的按约定关联。特别是,一个服务可以有多个端点(例如区域化、MTLS和私有访问),完整资源名字在这些端点之间保持不变。

表示资源名字的域

在定义资源时,第一个域 应当 是资源名字,它 必须 是 string 类型,并且 必须 称为 name 。消息 应当 包含 google.api.resource 注解,声明类型(更多信息请参考AIP-123)。

// A representation of a book in the library.
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];// Other fields...
}

在定义查询或操作现有资源的方法(例如 GetBook 或 ArchiveBook )时,请求消息的第一个域 应当 是资源名字,它 必须 是 string 类型, 必须 称为 name 。它还 应当 使用 google.api.resource_reference 注解,引用资源类型(AIP-123)。

// Request message for ArchiveBook
message ArchiveBookRequest {// The book to archive.// Format: publishers/{publisher}/books/{book}string name = 1 [(google.api.field_behavior) = REQUIRED,(google.api.resource_reference) = {type: "library.googleapis.com/Book"}];// Other fields...
}

注意: 除了用于这个目的,域 不得 称为 name 。对于其他场景,要么使用其他词汇,要么添加形容词前缀(例如 display_name )。

表示上级资源的域

在定义从集合中查询资源,或者向集合添加新资源的方法(例如 ListBooks 或 CreateBook )时,请求消息的第一个域 应当 是 string 类型, 应当 称为 parent 。 parent 域还 应当 使用 google.api.resource_reference 注解,引用上级资源类型(API-123)。

// Request message for ListBooks.
message ListBooksRequest {// The publisher to list books from.// Format: publishers/{publisher_id}string parent = 1 [(google.api.resource_reference) = {type: "library.googleapis.com/Publisher"}];// Other fields (e.g. page_size, page_token, filter, etc.)...
}

如果有多个可能的上级类型, parent 域 应当 使用 google.api.resource_reference 上的 child_type 键注解:

// Request message for ListBooks.
message ListBooksRequest {// The parent to list books from.// Format://   - publishers/{publisher_id}//   - authors/{author_id}string parent = 1 [(google.api.field_behavior) = REQUIRED,(google.api.resource_reference) = {child_type: "library.googleapis.com/Book"}];// Other fields (e.g. page_size, page_token, filter, etc.)...
}

注意: 除非用于这个目的,域 不应 称为 parent 。对于其他场景,尽量使用同义词。

表示其他资源的域

当域表示另外的资源时,它 应当 是 string 类型,值是另外资源的名字。域名字 应当 是对应消息名字的snake_case命名。

  • 域名字 可以 包括前导形容词(例如 string dusty_book )。
  • 除非可能引发歧义,域名字 不应 使用 _name 后缀,(例如 crypto_key_name )。
  • 表示另外资源的域 应当 提供 google.api.resource_reference 注解,引用对应资源类型。
  • 如果无法使用资源名字,同时标识组件也是必不可少的,域 应当 使用 _id 后缀(例如 shelf_id )。

除非 满足以下条件之一,域 不应 是实现对应资源的 message 类型:

  • API是内部专用的,具有紧凑的生命周期关系,并且其权限模型支持继承内嵌资源访问权限。
  • 内嵌资源是AIP-162修订模式的一部分。

资源引用示例:

// A representation of a book in a library.
message Book {option (google.api.resource) = {type: "library.googleapis.com/Book"pattern: "publishers/{publisher}/books/{book}"};// Name of the book.// Format is `publishers/{publisher}/books/{book}`string name = 1 [(google.api.field_behavior) = IDENTIFIER];// The shelf where the book currently sits.// Format is `shelves/{shelf}`.string shelf = 2 [(google.api.resource_reference) = {type: "library.googleapis.com/Shelf"}];// Other fields...
}

进一步阅读

  • 关于资源名字随时间演进的问题,请参考AIP-180。
  • 关于资源类型,请参考AIP-123。

理由

使用名字代替标识

任何大型系统都有许多资源类型。要使用简单的标识来识别资源,实际上我们需要使用资源特定的元组来准确的标识它,例如 (bucket, object) 或 (user, album, photo) 。这会产生几个问题:

  • 开发人员必须理解记忆这些不具名元组。
  • 传递元组通常比传递字符串更难。
  • 集中式基础设施(如日志和访问控制系统)无法理解特定用途元组。
  • 特定用途元组限制了API设计的灵活性,例如提供可重用的API接口。例如由于使用了灵活的资源名字,长时间运行的操作可以与许多其他API接口一起工作。

建立标准域 name

资源名字的概念并不是新的,它和统一资源标识符(URI)、统一资源定位符(URL)一起,在统一资源名字(URN)中正式确定。考虑到“name”一词在大部分情况下被过度使用,超出明确定义范围之外用法,会令开发人员感到困惑。因此在符合AIP标准的API中,域名字 name 被保留,避免资源名字混淆,强制其他可能被命名为“name”的域使用更具体的名字。

禁止资源嵌套

直接在资源中使用另一个资源的消息作为域的类型存在隐患,原因如下:

  • 让资源生命周期更复杂:如果上游资源被删除,下游资源中内嵌的资源引用会发生什么?数据保留和清理操作变得非常复杂。
  • 绕过权限:如果每个资源都有自己的权限集合,如果用户拥有读取下游资源权限,但没有读取上游资源权限,用户将无法看到完整资源。
  • 在每一方面都造成了资源紧耦合:更改任一资源的模式、权限或其他要求都会影响另外的资源,显著增加工作的复杂性。

按推荐方法,通过名字引用资源,可以消除上述复杂性,防止资源数重复,强制所属服务参与引用解析工作(通过标准方法),保证资源间的逻辑关注点隔离。

修订记录

  • 2024-10-15 : 添加关于使用 name 代替标识符作为域标识的理由。
  • 2024-06-14 : 明确内嵌集合使用的资源注释简化规则。
  • 2023-09-19 : 禁止集合标识符重复。
  • 2023-09-01 : 添加允许内嵌修订资源消息的条款。
  • 2023-08-10 : 明确禁止在资源中内嵌资源消息。
  • 2023-03-24 : 更正:完整资源名字包含服务名字,而非服务端点。
  • 2023-03-17 : 添加资源标识域 OUTPUT_ONLY 相关指南。
  • 2020-10-06 : 添加声明式友好指南,收紧字符集限制。
  • 2020-10-05 : 明确使用完整资源名字的场景。
  • 2020-05-19 : 明确要求资源 标识 (而非整个资源 名字 )避免大写字符。
  • 2020-04-27 : 收紧有效字符限制。
  • 2019-12-05 : 添加资源注释指南。
  • 2019-08-01 : 将示例“shelves”更改为“publishers”,提供更好的资源所有权示例。将最后一个示例从Pub/Sub示例改为通用的Book示例。
  • 2019-07-30 : 将内嵌集合简化建议从“可以”改为“应当”。

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

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

相关文章

Redis数据库笔记——持久化机制

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Redis的持久化机制,目标是将内存中的数据持久化到磁盘,以保证数据的可靠性和在重启后的恢复能力。 文章目录 持久化机制A…

K8S 集群搭建和访问 Kubernetes 仪表板(Dashboard)

一、环境准备 服务器要求: 最小硬件配置:2核CPU、4G内存、30G硬盘。 服务器可以访问外网。 软件环境: 操作系统:Anolis OS 7.9 Docker:19.03.9版本 Kubernetes:v1.18.0版本 内核版本:5.4.203-…

vue中echarts-中国地图,世界地图显示(echarts5.6版本本地导入)

地图去掉南海诸岛右下角的框显示(因为显示的不是现在的10段线) 资源里面主要是有个改好的中国地图json其他的无所谓,用现有的json也行,主要是为了解决10段线的问题 引入需要注意 import * as echarts from “./echarts”; 目录…

数据结构(三) 排序/并查集/图

目录 1. 排序 2.并查集 3.图 1.排序: 1.1 概念: 排序就是将数据按照某种规则进行排列, 具有某种顺序. 分为内排序和外排序. 内排序就是: 将数据放在内存中的排序; 外排序是: 数据太多无法在内存中排序的. 1.2 插入排序: 插入排序包含: 直接插入排序和希尔排序. (1) 直接插入…

算法随笔_13: 有效三角形的个数

上一篇:算法随笔_12:最短无序子数组-CSDN博客 题目描述如下: 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 算法…

CSS 网络安全字体

适用于 HTML 和 CSS 的最佳 Web 安全字体 下面列出了适用于 HTM L和 CSS 的最佳 Web 安全字体: Arial (sans-serif)Verdana (sans-serif)Helvetica (sans-serif)Tahoma (sans-serif)Trebuchet MS (sans-serif)Times New Roman (serif)Georgia (serif)Garamond (se…

大模型学习笔记 - 第一期 - Milvus向量数据库

大模型学习笔记 - 向量数据库 目录 大模型学习笔记 - 向量数据库传统文字检索(无嵌入)面临的困境1. 用户和商户表述差异2. 不同语种的表述差异3. 不同背景下的音译表述差异 向量检索向量化服务 参考 传统文字检索(无嵌入)面临的困境 1. 用户和商户表述差异 ​ 如果商户维护了…

详细图文解读Transformer模型:《Attention is All You Need》完整版

目录 前言1、Transformer模型《Attention is All You Need》总结2、Transformer整体结构2.1、工作流程 3、Transformer的输入4、Self-Attention(自注意力机制)4.1、Self-Attention 结构4.2、Q, K, V计算4.3、Self-Attention 的输出4.4、Multi-Head Atten…

Hadoop•用Web UI查看Hadoop状态词频统计

听说这里是目录哦 通过Web UI查看Hadoop运行状态🐇一、关闭防火墙二、在物理计算机添加集群的IP映射三、启动集群四、进入HDFS的Web UI 词频统计🦩1、准备文本数据2、在HDFS创建目录3、上传文件4、查看文件是否上传成功5、运行MapReduce程序6、查看MapRe…

Ubuntu、Windows系统网络设置(ping通内外网)

一、 虚拟机VMware和Ubuntu系统的网络配置说明 1、虚拟机的网络适配器的模式有三种: 桥接模式NAT模式主机模式 2、虚拟机VMware的网卡配置(如何进行配置界面(虚拟机->设置)) 注意: 1、以上桥接模式(ubuntu有独立IP)、NAT模式(没有独立IP)都可以联…

将IDLE里面python环境pyqt5配置的vscode

首先安装pyqt5全套:pip install pyqt5-tools 打开Vscode: 安装第三方扩展:PYQT Integration 成功配置designer.exe的路径【个人安装pyqt5的执行路径】,便可直接打开UI文件,进行编辑。 配置pyuic,如果下图填写方法使用…

C# OpenCV机器视觉:特征匹配 “灵魂伴侣”

在一个阳光仿佛被施了魔法,欢快得直蹦跶的早晨,阿强像个即将踏上神秘寻宝之旅的探险家,一屁股墩在实验室那张堆满各种奇奇怪怪小玩意儿的桌前。桌上,零件、线路、半成品设备乱成一团,唯有他那宝贝电脑屏幕散发着清冷又…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证

第一种基于binlog的主从同步 首先对主库进行配置: [rootopenEuler-1 ~]# vim /etc/my.cnf 启动服务 [rootopenEuler-1 ~]# systemctl enable --now mysqld 主库的配置 从库的配置 第一个从库 [rootopenEuler-1 ~]# vim /etc/my.cnf [rootopenEuler-1 ~]# sys…

Spring自定义BeanPostProcessor实现bean的代理Java动态代理知识

上文:https://blog.csdn.net/qq_26437925/article/details/145241149 中大致了解了spring aop的代理的实现,其实就是有个BeanPostProcessor代理了bean对象。顺便复习下java代理相关知识 目录 自定义BeanPostProcessor实现aopJava动态代理知识动态代理的几…

医院挂号就诊系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装医院挂号就诊系统软件来发挥其高效地信息处理的作用&#…

【GORM】初探gorm模型,字段标签与go案例

GORM是什么? GORM 是一个Go 语言 ORM(对象关系映射)库,它让我们可以使用结构体来操作数据库,而无需编写SQL 语句 GORM 模型与字段标签详解 在 GORM 中,模型是数据库表的抽象表示,字段标签&am…

R 语言科研绘图第 20 期 --- 箱线图-配对

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…

【物联网】ARM核介绍

文章目录 一、芯片产业链1. CPU核(1)ARM(2)MIPS(3)PowerPc(4)Intel(5)RISC-V 2. SOC芯片(1)主流厂家(2)产品解决方案 3. 产品 二、ARM核发展1. 不同架构的特点分析(1)VFP(2)Jazelle(3)Thumb(4)TrustZone(5)SIMD(6)NEON 三、ARM核(ARMv7)工作模式1. 权限级别(privilege level)2.…

uniApp开通uniPush1.0个推,SpringBoot集成uniPush1.0个推

uniApp开通unipush1.0个推,SpringBoot程序集成 一、APP开通unipush1.0个推(商户App源码仅支持1.0个推) 1.app模块配置开通推送 2.应用开通推送 3.开通后点击消息推送菜单会看到如下页面 完成以上步骤后 此时android 仅支持在线推送。 4.配置各厂商离线推送 暂未…

JS宏进阶: 工厂函数与构造函数

一、构造函数 在JavaScript中,构造函数是一种用于创建和初始化对象的特殊函数。构造函数的名字通常以大写字母开头,以区分于普通函数。通过new关键字调用构造函数,可以创建一个新的实例对象,并自动执行构造函数内部的代码来初始化…