Microsoft REST API指南
序言
经过3个月的碎片时间的翻译和校验,由长沙.NET技术社区翻译的英文原文文档《Microsoft REST API指南》已经翻译完成,现刊载前十一章如下,欢迎大家点击“查看原文”按钮,查看指南的完整内容。
PS:内容很长,全文读完大概需要耗时100分钟。
Microsoft REST API指南工作组
Name | Name | Name |
---|---|---|
Dave Campbell (CTO C+E) | Rick Rashid (CTO ASG) | John Shewchuk (Technical Fellow, TED HQ) |
Mark Russinovich (CTO Azure) | Steve Lucco (Technical Fellow, DevDiv) | Murali Krishnaprasad (Azure App Plat) |
Rob Howard (ASG) | Peter Torr (OSG) | Chris Mullins (ASG) |
Document editors: John Gossman (C+E), Chris Mullins (ASG), Gareth Jones (ASG), Rob Dolin (C+E), Mark Stafford (C+E)
感谢.NET长沙社区提供的翻译,感谢译者李文强,译者周尹
本文首发 .NET社区公众号,欢迎关注, 搜索 MoreDotNetCore ,里面有最新的原创性资讯,获得第一手的资料。
摘要
Microsoft REST API指南作为一种设计原则,鼓励应用程序开发人员通过RESTful HTTP接口访问资源。
文档原则认为REST API应该遵循一致的设计指导原则,能为开发人员提供最流畅的体验,令使用它们变得简单和直观。
本文档建立了Microsoft REST API应该遵循的指导原则,以便统一一致的开发RESTful接口。
引言
开发人员通常通过HTTP接口访问大多数微软云平台资源。虽然每个服务通常提供特定于语言框架来包装其API,但它们的所有操作最终都归结为HTTP请求。微软必须支持广泛的客户端和服务,不能依赖于每个开发环境都有丰富的框架。因此,本指导原则的目标是确保Microsoft REST API能够被任何具有基本HTTP支持的客户端轻松且一致地使用。
[*]译者注:本指南不限于微软技术和平台,广泛适应于各种语言和平台。
为了给开发人员提供最流畅的体验,让这些API遵循统一的设计准则是很重要的,从而使其简单易用,符合人们的直觉反应。本文档建立了 Microsoft REST API 开发人员应该遵循的指南, 以便统一一致地开发API。
一致性的好处在于可以不断地积累合理的规范;一致性使团队拥有统一的代码、模式、文档风格和设计策略。
这些准则旨在达成如下目标:
- 为Microsoft技术平台所有API端点定义一致的实现和体验。
- 尽可能地遵循行业普遍接受的 REST/HTTP 最佳实践。
- 让所有应用开发者都可以轻松的通过REST接口访问Micosoft服务。
- 允许Service开发者利用其他Service的基础上来开发一致的REST API端点。
- 允许合作伙伴(例如,非Micosoft团队)使用这些准则来设计自己的 REST API。
[*]注:本指南旨在构建符合 REST 架构风格的服务,但不涉及或要求构建遵循 REST 约束的服务。
本文档中使用的“REST”术语代指具有 RESTful风格的服务,而不是仅仅遵循 REST。
推荐阅读
了解REST架构风格背后的理念,更有助于开发优秀的基于 HTTP 的服务。
如果您对 RESTful 设计不熟悉,请参阅以下优秀资源:
- REST on Wikipedia — 维基百科上关于REST的核心概念与思想的介绍。
- REST论文—— Roy Fielding网络架构论文中关于REST的章节,“架构风格与基于网络的软件体系结构设计”
- RFC 7231—— 定义HTTP/1.1 语义规范的权威资源。
- REST 实践—— 关于REST的基础知识的入门书。
[*]译者注:上一篇说了,REST 指的是一组架构约束条件和原则。那么满足这些约束条件和原则的应用程序或设计就是 RESTful。
4. 解读指导
4.1 应用指南
这些准则适用于Microsoft或任何合作伙伴服务公开的任何REST API。私有或内部API也应该尝试遵循这些准则,因为内部服务最终可能会被公开。保证一致性不仅对外部客户有价值,对内部服务使用者也很有价值,而这些准则为对任何服务都提供了最佳实践。
有合理理由可不遵循这些准则。如:实现或必须与某些外部定义的REST API互操作的REST服务必须与哪些外部的API兼容,而无法遵循这些准则。而还有一些服务也可能具有需要特殊性能需求,必须采用其他格式,例如二进制协议。
4.2 现有服务和服务版本控制的指南
我们不建议仅仅为了遵从指南而对这些指南之前的旧服务进行重大更改。无论如何,当兼容性被破坏时,该服务应该尝试在下一版本发布时变得合规。
当一个服务添加一个新的API时,该API应该与同一版本的其他API保持一致。
因此,如果服务是针对 1.0 版本的指南编写的,那么增量添加到服务的新 API 也应该遵循 1.0 版本指南。然后该服务在下一次主要版本更新时,再去遵循最新版指南。
4.3 要求语言
本文档中的”MUST”(必须), “MUST NOT”(禁止), “REQUIRED”(需要), “SHALL”(将要), “SHALL NOT”(最好不要), “SHOULD”(应该), “SHOULD NOT”(不应该), “RECOMMENDED”(推荐), “MAY”(可能), 和 “OPTIONAL”(可选) 等关键字的详细解释见 RFC 2119。
4.4 许可证
本作品根据知识共享署名4.0国际许可协议授权。如需查看本授权的副本,请访问http://creativecommons.org/licenses/by/4.0/ 或致函 PO Box 1866, Mountain View, CA 94042, USA.
》 [*]译者注:署名 4.0 国际,也就是允许在任何媒介以任何形式复制、发行本作品,允许修改、转换或以本作品为基础进行创作。允许任何用途,甚至商业目的。
5. 分类
作为Microsoft REST API指南的一部分,服务必须符合下面定义的分类法。
5.1 错误
错误,或者更具体地说是服务错误,定义为因客户端向服务传递错误数据,导致服务端拒绝该请求。示例包括无效凭证、错误的参数、未知的版本ID等。客户端传递错误的或者不合法的数据的情况通常返回 “4XX” 的 HTTP 错误代码。
错误不会影响API的整体可用性。
[*]译者注:错误可以理解成客户端参数错误,通常返回“4XX”状态码,并不影响整体的API使用。
5.2 故障
故障(缺陷),或者更具体地说是服务故障,定义为服务无法正确返回数据以响应有效的客户端请求。通常会返回“5xx”HTTP错误代码。
故障会影响整体 API 的可用性。
由于速率限制(限流)或配额故障而失败的调用不能算作故障。由于服务快速失败(fast-failing)请求(通常是为了保护自己)而失败的调用会被视为故障。
[*]译者注:故障意味着服务端代码出现故障,可能会影响整体的API使用。比如数据库连接超时。
fast-failing 快速失败
safe-failing 安全失败
5.3 延迟
延迟定义为特定的API调用完成所需的时间(尽可能使用客户端调用进行测量)。此测量方法同样适用于同步和异步的API。对于长时间运行(long running calls)的调用,延迟定义为第一次调用它所需的时长,而不是整个操作)完成所需的时间。
[*]译者注:Latency(延迟)是衡量软件系统的最常见的指标之一,不仅仅和系统、架构的性能相关,还和网络传输和延迟有关系。
5.4 完成时间
暴露长时间操作的服务必须跟踪这些操作的 “完成时间” 指标。
5.5 长期运行API故障
对于长期运行的 API,很可能出现第一次请求成功,且后续每次去获取结果时 API 也处于正常运行(每次都回传 200)中,但其底层操作已经失败了的情况。长期运行故障必须作为故障汇总到总体可用性指标中。
6. 客户端指导
为确保客户端更好的接入REST服务,客户端应遵循以下最佳实践:
6.1 忽略规则
对于松散耦合的客户端调用,在调用之前不知道数据的确切定义和格式,如果服务器没用返回客户端预期的内容,客户端必须安全地忽略它。
在服务迭代的过程中,有些服务(接口)可能在不更改版本号的情况下向响应添加字段。此类服务必须在其文档中注明,客户端必须忽略这些未知字段。
[*]译者注:一个已发布的在线接口服务,如果不修改版本而增加字段,那么一定不能影响已有的客户端调用。
6.2 变量排序规则
客户端处理响应数据时一定不能依赖服务端JSON响应数据字段的顺序。例如,当服务器返回的 JSON 对象中的字段顺序发生变化,客户端应当能够正确进行解析处理。
当服务端支持时,客户端可以请求以特定的顺序返回数据。例如,服务端可能支持使用$orderBy querystring参数来指定JSON数组中元素的顺序。
服务端也可以在协议中显式说明指定某些元素按特定方式进行排序。例如,服务端可以每次返回 JSON 对象时都把 JSON
对象的类型信息作为第一个字段返回,进而简化客户端解析返回数据格式的难度。客户端处理数据时可以依赖于服务端明确指定了的排序行为。
6.3 无声失效规则
当客户端请求带可选功能参数的服务时(例如带可选的头部信息),必须对服务端的返回格式有一定兼容性,可以忽略某些特定功能。
[*]译者注:例如分页数、排序等自定义参数的支持和返回格式的兼容。
7. 基础原则
7.1 URL结构
URL必须保证友好的可读性与可构造性,人类应该能够轻松地读取和构造url。
Microsoft REST API指南的更多相关文章
- REST API设计指导——译自Microsoft REST API Guidelines(四)
前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...
- REST API设计指导——译自Microsoft REST API Guidelines(二)
由于文章内容较长,只能拆开发布.翻译的不对之处,请多多指教. 另外:最近团队在做一些技术何架构的研究,视频教程只能争取周末多录制一点,同时预计在下周我们会展开一次直播活动,内容围绕容器技术这块. 所有 ...
- REST API设计指导——译自Microsoft REST API Guidelines(一)
前言 前面我们说了,有章可循,有据可依,有正确的产品流程和规范,我们的工作才不至于产生混乱,团队的工作才能更有成效.我们经常见到,程序开发可能只用了半个月,但是接口的联调却经常需要花费半个月甚至一个月 ...
- Zookeeper C API 指南四(C API 概览)(转)
上一节<Zookeeper C API 指南三(回调函数)>重点讲了 Zookeeper C API 中各种回调函数的原型,本节将切入正题,正式讲解 Zookeeper C API.相信大 ...
- Zookeeper C API 指南三(回调函数)(转)
2013-02-21 12:54 by Haippy, 9237 阅读, 0 评论, 收藏, 编辑 接上一篇<Zookeeper C API 指南二(监视(Wathes), 基本常量和结构体介绍 ...
- Zookeeper C API 指南一(转)
Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...
- Android开发-API指南-<provider>
<provider> 英文原文:http://developer.android.com/guide/topics/manifest/provider-element.html 采集(更新 ...
- Android开发-API指南-Intent和Intent过滤器
Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...
- Microsoft Graph API -----起题 Graph API
最近因为工作需要,接触学习使用了Microsoft Graph API.在看完Microsoft的Graph官方文档之后,也做了一些简单的案例,在Stack Overflow上做过一些回答.整体来说, ...
随机推荐
- [CSP-S模拟测试]:Dinner(二分)
题目描述 清儿今天请好朋友们吃饭,一共$N$个人坐在坐在圆桌旁.吃饭的第一步当然是点餐了.服务员拿来了$M$份菜单.第$i$个人阅读菜单并点出自己喜欢的菜需要花费时间$T_i$.当一个人点完菜之后,就 ...
- 牛客2019提高D1t1 最短路
分析 我们发现可以按照ai从小到大排序 边的大小就是当前的a减去前面第一个不等于它的a 代码 #include<iostream> #include<cstdio> #incl ...
- ST表——————一失足成千古恨系列2
在此先祝自己这个系列写的越少越好qwq(保证不超过4篇(flag已立)) 考试原题:(绝壁是看完复联出的) 第一反应:线段树??不对,是st表.嗯,没错.哎,st表咋写来着??完了凉了. 结果:写暴搜 ...
- 140、spring webflux 高并发的spring组件
最近公司可谓是风云变幻,年前说要拆开卖,后来说要整体卖,表示像我这种渣渣,始终逃脱不掉被卖的命运 下面进入正题 spring webflux 是spring 支持的高并发web框架,将每个http请求 ...
- Iterator 和 ListIterator 对比
Iterator 的方法 //是否还有下一个 boolean hasNext(); //返回下一个 E next(); //移除返回的下一个 void remove(); ListIterator 的 ...
- ELK 日志系统入门及通过 Docker 部署
1. ELK 系统是什么 ELK 是一套日志中心解决方案,其三个字母分别表示: Elasticsearch:负责日志存储及检索 Logstash:负责日志收集.过滤及格式化 Kibana:数据看板,负 ...
- JS对象—字符串总结(创建、属性、方法)
1.创建字符串 1.1 new String(s) String和new一起使用,创建的是一个字符串对象,存放的是字符串s的表示. 1.2 String(s) ...
- 设置chrome解决跨域问题
开发中遇到跨域问题, 解决方法一 以关闭安全验证模式启动chrome,就不会报跨域了 开发阶段,用这个方式是可以的,不然他需要后台配置成 * , 发布会有风险 设置方法: --disable-w ...
- Java thread(3)
线程间的调度策略 通常是选择优先级高的线程,但是若发生以下情况则终止线程的运行: 1 调用yield 让出对cpu的占用权. 2 调用sleep 3 线程由于I/O操作而受阻 4 更高优先级的线 ...
- Linux:VIM简单入手
现在的Linux系统一般都会默认安装VIM编辑器,如果没有安装VIM编辑器,也默认一定会有VI编辑器,VI编辑器产生的时间比鼠标来的更早,虽然功能很强大,但我建议安装VIM工具,安装了VIM之后,VI ...