序言

经过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 设计不熟悉,请参阅以下优秀资源:

  1. REST on Wikipedia — 维基百科上关于REST的核心概念与思想的介绍。
  2. REST论文—— Roy Fielding网络架构论文中关于REST的章节,“架构风格与基于网络的软件体系结构设计”
  3. RFC 7231—— 定义HTTP/1.1 语义规范的权威资源。
  4. 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指南的更多相关文章

  1. REST API设计指导——译自Microsoft REST API Guidelines(四)

    前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...

  2. REST API设计指导——译自Microsoft REST API Guidelines(二)

    由于文章内容较长,只能拆开发布.翻译的不对之处,请多多指教. 另外:最近团队在做一些技术何架构的研究,视频教程只能争取周末多录制一点,同时预计在下周我们会展开一次直播活动,内容围绕容器技术这块. 所有 ...

  3. REST API设计指导——译自Microsoft REST API Guidelines(一)

    前言 前面我们说了,有章可循,有据可依,有正确的产品流程和规范,我们的工作才不至于产生混乱,团队的工作才能更有成效.我们经常见到,程序开发可能只用了半个月,但是接口的联调却经常需要花费半个月甚至一个月 ...

  4. Zookeeper C API 指南四(C API 概览)(转)

    上一节<Zookeeper C API 指南三(回调函数)>重点讲了 Zookeeper C API 中各种回调函数的原型,本节将切入正题,正式讲解 Zookeeper C API.相信大 ...

  5. Zookeeper C API 指南三(回调函数)(转)

    2013-02-21 12:54 by Haippy, 9237 阅读, 0 评论, 收藏, 编辑 接上一篇<Zookeeper C API 指南二(监视(Wathes), 基本常量和结构体介绍 ...

  6. Zookeeper C API 指南一(转)

    Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...

  7. Android开发-API指南-<provider>

    <provider> 英文原文:http://developer.android.com/guide/topics/manifest/provider-element.html 采集(更新 ...

  8. Android开发-API指南-Intent和Intent过滤器

    Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...

  9. Microsoft Graph API -----起题 Graph API

    最近因为工作需要,接触学习使用了Microsoft Graph API.在看完Microsoft的Graph官方文档之后,也做了一些简单的案例,在Stack Overflow上做过一些回答.整体来说, ...

随机推荐

  1. eval方法遇到的问题

    工作中有这样的场景,一个表达式比如 2*2,计算结果是number,这样的为true,如果输入错误 2*@,这样的情况需要匹配为false. 这里使用的eval方法, type of (eval('2 ...

  2. 常见的网络设备:集线器 hub、网桥、交换机 switch、路由器 router、网关 gateway

    Repeater 中继器 Hub 集线器 bridge 网桥 switch 交换机 router 路由器 gateway 网关 网卡 参考资料: do-you-know-the-differences ...

  3. Vagrant 手册之网络 - 公共网络 public network

    原文地址 Vagrantfile 配置文件中公共网络的标识符:public_network,例如: config.vm.network "public_network" Vagra ...

  4. SQL Server 分页语句查询

    --查询第10页的数据(15条) SELECT TEMP1.* FROM( SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,* FR ...

  5. 通过queue实现前端的被动接收

    一般请求都是由前端主动发起请求,后端响应,但有些情况必须要后端达到一定条件了才向前端相应数据,这就变成前端被动了.比如微信接收信息,只有别人给你发消息,你才能被动接收消息. 最近做了个项目,当有人经过 ...

  6. java创建线程的两种方式及源码解析

    创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...

  7. project euler-34

    145是个奇怪的数字.由于1!+ 4! + 5! = 1 + 24 + 120 = 145. 请求出能表示成其每位数的阶乘的和的全部数的和. 请注意:由于1! = 1和2! = 2不是和,故它们并不包 ...

  8. MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)

    本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...

  9. JS的video获取时长,出现问题汇总

    <video id="my_video_1" controls="controls" style=" width: 700px; height: ...

  10. Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截

    原文链接:https://blog.csdn.net/qq_38762313/article/details/85234594 全局异常拦截器:       解决写每个接口都需要去做容错而添加try{ ...