Google API Design Guide (谷歌API设计指南)中文版
面向资源的设计
这份设计指南的目标是帮助开发人员设计简单、一致、易用的网络API。同时,它也有助于收敛基于socket的API和(注:原文是with,这里翻译为“和”)基于HTTP的REST API。
以前,人们根据诸如CORBA和Windows COM这样的API接口和方法设计RPC API。随着时间的推移,接口和方法越来越多。最后,接口和方法数不胜数又各不相同。开发人员要正确使用它们,必须仔细了解每一个的用法,这很浪费时间而且容易出错。
2000年,为了与HTTP1.1搭配使用,REST架构风格出现。它的核心原则是定义用少量方法就能操作的命名资源。资源和方法可视为API的名词和动词。在HTTP协议中,资源名称自然地对应于URL,方法则对应于HTTP的POST
、GET
、PUT
、PATCH
和DELETE
方法。
在互联网领域,HTTP REST API最近获得了巨大的成功。截至2010年,大约74%的公网API都是HTTP REST API。
尽管HTTP REST API在互联网领域已经很流行了,但其承载的流量还是比传统的RPC API小。比如,在高峰期,美国大约一半的互联网流量都是视频内容,出于性能上的考虑,很少有人用REST API。在数据中心内部,更多的公司也使用基于socket的RPC API来承载大多数网络流量,这比REST API的数量高出几个量级。
事实上,RPC API和HTTP REST API都有存在的理由。在理想情况下,API平台最好提供这两种API。这份设计指南也是基于这一原则帮你设计和构建API。在通用API设计上,本指南应用面向资源设计的原则,定义了众多常见的设计模式以提高易用性并降低复杂性。
注意:本设计指南解释了如何将REST原则用于独立于编程语言,操作系统或者网络协议的API设计,它不只是用于创建REST API的指南。
什么是REST API
一组REST API被建模为一组可独立寻址的资源(API的名词)。资源被通过资源名称被引用,通过一小组方法(也被称为动词或者操作)被操作。
Google REST API(也被称为REST方法)的标准方法有List
,Get
,Create
,Update
和Delete
。API的设计者也可以用自定义方法(也被称为自定义动词或者自定义操作),来完成那些不易对应到标准方法的功能,比如数据库事务。
注意:自定义动词不意味着创建自定义的HTTP动词以支持自定义方法。对于基于HTTP的API来说,自定义动词被对应到最合适的HTTP动词上。(译者注:不能自创HTTP动词,应该使用含义最接近的HTTP动词去设计API)
设计流程
设计指南建议使用以下步骤设计面向资源的API(更多细节请参考下面指定章节):
- 确定一个API提供什么类型的资源
- 确定资源之间的关系
- 根据资源类型和关系确定资源命名方案
- 明确资源schema
- 给资源添加最少的方法集
资源
面向资源的API通常被建模为一个资源层次结构。其中每一个节点可以是一个简单资源也可以是一组资源。为了方便,它们通常被称为资源或者资源组。
- 资源组包含相同类型的一系列资源。比如,一个用户有一组联系人。
- 资源有相同的状态,也有零或者多个子资源。每一个子资源可以是单个资源也可是一组资源。
例如,Gmail API有一组用户,每个用户有一组消息,一组主题,一组标签,单个用户配置资源或多个设置项资源。
尽管REST API和存储系统有概念上的一致性,但具有面向资源的API的服务不一定是数据库,并且在如何解释资源和方法上有巨大的灵活性。比如,创建一个日历事件(资源)可能会为参会者创建附加事件,向参会者发送邀请邮件,预约会议室,更新视频会议日程表。
方法
面向资源的API的关键特性是强调资源(数据模型)和(译者注:原文看起来是笔误,这里应该翻译为和)运行在资源上的方法(功能)。典型的面向资源的API通过少量方法的暴露大量资源。这些方法可以是标准的或者自定义的。在本指南中,标准方法是指:List
,Get
,Create
,Update
和Delete
。
当API功能自然地映射到一个标准方法时,这个方法应当用于API设计。若当功能不能自然的映射到标准方法时,可以使用自定义方法。自定义方法能提供与传统RPC API一样的设计自由度,可以用来实现常见的编程模式,比如数据库事务或者数据分析。
例子
接下来,我们看一看现实中如何使用面向资源的API来设计大规模服务。
Gmail API
Gmail API服务实现了Gmail API,暴露了绝大多数Gmail的功能。它的资源模型如下:
- Gmail API服务:
gmail.googleapis.com
- 一组用户:
users/*
。每个用户有如下资源。- 一组消息:
users/*/messages/*
。 - 一组主题:
users/*/threads/*
。 - 一组标签:
users/*/labels/*
。 - 一组变更历史:
users/*/history/*
。 - 一个代表用户资料的资源:
users/*/profile
- 一个代表用户配置的资源:
users/*/settings
- 一组消息:
Google Cloud Pub/Sub API
pubsub.googleapis.com
服务实现了Goole Cloud Pub/Sub API,它定义了以下资源模型:
- API服务:
pubsub.googleapis.com
- 一组主题:
projects/*/topics/*
。 - 一组订阅:
projects/*/subscriptions/*
。
注意:PUB/SUB API的其他实现可能选用了与上面不同的命名规则。
Google API Design Guide (谷歌API设计指南)中文版的更多相关文章
- 来自HeroKu的HTTP API 设计指南(中文版)
原文转自:http://get.jobdeer.com/343.get 来自HeroKu的HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国内 ...
- Atitit.index manager api design 索引管理api设计
Atitit.index manager api design 索引管理api设计 1. kw 1 1.1. 索引类型 unique,normal,fulltxt 1 1.2. 聚集索引(cluste ...
- Atitit.index manager api design 索引管理api设计
Atitit.index manager api design 索引管理api设计 1. kw1 1.1. 索引类型 unique,normal,fulltxt1 1.2. 聚集索引(clustere ...
- [置顶]
来自 HeroKu 的 HTTP API 设计指南(中文版)
转载:http://get.jobdeer.com/343.get 来自 HeroKu 的 HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国 ...
- HTTP API 设计指南(中文版) restfull
http://www.css88.com/archives/5121 目录 基础 总是使用TLS 在Accepts头中带上版本号 通过Etags支持缓存 用Request-Ids追踪请求 用Range ...
- HTTP API 设计指南(转)
add by zhj (2014-12-16): 今天才知道,原画HeroKu是国外一个很有名的PaaS提供商,公司很可能会将app迁移到他们那里 英文原文: HTTP API Design Guid ...
- Effective API Design
Effective API Design */--> div.org-src-container { font-size: 85%; font-family: monospace; } Tabl ...
- Principles of good RESTful API Design 好的 RESTful API 设计
UPDATE: This post has been expanded upon and converted into an eBook. Good API design is hard! An AP ...
- 组件接口(API)设计指南-文件夹
组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...
随机推荐
- 反射与内置方法str del
1.反射 用字符串来操作类或者对象的属性 class People:# country= 'china'# def __init__(self,name):# self.name= name## de ...
- BZOJ1889 : Maximal
二分答案,判断是否存在合法方案使得每个数都不超过$mid$. 考虑网络流建图: $i$点的流量下限为$\max(a_i-mid,0)$,费用为$1$,故拆点进行限制. $i$向$i+1$.$S$向$i ...
- shell脚本6--循环,比较
for循环 for var in list; do commands;#使用变量$var done example: for i in {a..z}; do actions; done; 后者 for ...
- jsp下载文件的实现方法及注意事项 (转)
jsp中实现文件下载,最简单的方式是在网页上做超级链接,如:<a href="music/abc.mp3">点击下载</a>. 但是,这样服务器上的目录资源 ...
- JS_高程4.变量,作用域和内存问题(1)
1.基本类型和应用类型的值 ECMAScript变量可能包含两种不同数据类型的值: 基本类型值——简单的数据段.(5种基本的数据类型,按值访问,因为可以操作保存在变量中的实际的值.) 引用类型值——多 ...
- GMA Round 1 新年祝福
传送门 新年祝福 15个人聚集在一起,新年到来,他们每个人写下了一句新年祝福.大家把祝福收集起来,然后重新分回去.如果一个人拿到了自己写的祝福,他就会觉得很没有意思,因为得不到别人的祝福.要避免这种尴 ...
- Error: Invalid or corrupt jarfile
使用IDEA通过MAVEN创建quickstart项目后,添加了Artifacts,发现生成的jar包无法run,出现下面的错误: Error: Invalid or corrupt jarfile ...
- Kubernetes中的Configmap和Secret
本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 应用场景:镜像往往是一个应用的基础,还有很多需要 ...
- Linux目录/usr缩写及目录结构说明
在 linux 文件结构中,有一个很神奇的目录 —— /usr. 讨论中,大部分观点认为: usr 是 unix system resources 的缩写: usr 是 user 的缩写: u ...
- 通过Tag标签回退版本修复bug
tag是对历史一个提交id的引用,如果理解这句话就明白了使用git checkout tag即可切换到指定tag,例如:git checkout v0.1.0 切换到tag历史记录会处在分离头指针状态 ...