本文为授权译文。希望查看原文的同学请戳链接:https://hackernoon.com/restful-api-design-step-by-step-guide-2f2c9f9fcdbf

对于我们开发者来说,设计与实现REST API似乎已经成为了我们的日常生活。API现在已经成为了系统间互通的预设方式。AMAZON就是一个有效的使用API进行系统间沟通的最好的例子。在这篇文章中,我将重点讨论如何帮助你设计更好的API并避免一些常见的误区。

杰夫贝索斯的意志-亚麻的成功之路?

可能你已经大概了解了杰夫贝索斯对于亚马逊开发者的要求。如果你还没有听过,以下就是要点:

  1. 所有的团队今后必须通过服务接口来开放自己的数据和服务功能。
  2. 团队间只能通过这些接口进行通信。
  3. 其他所有的方式都不被允许:不可以直链,不可以直接去读取其他队伍的数据源,不能通过共享内存通信,不可以通过服务后门通信。总之,只能通过网络接口进行服务间的通信。
  4. 任何实现接口的技术都是被允许的:HTTP,Corba,Pubsub,自定义协议。贝索斯不在乎具体的实现。
  5. 所有的接口都需要被设计成可暴露型,不允许任何特例。也就是说,所有的团队都必须计划将自己的服务接口设计成可以被暴露给狂野的外部世界的形式。
  6. 任何人不遵守以上协议的,就滚蛋吧。

以上的要求现在看来正是亚马逊成功的关键。亚马逊在内部开发出可扩展的服务,成熟后就将这些服务暴露给外界使用。于是就有了我们所熟悉的强大的AWS。


RESTful API的设计原则

好吧,现在我们就开始了解一些我们设计RESTful API时需要遵守的一些原则。

能简单就简单 Keep It Simple

我们需要确保API的URL是简单的。比如说,如果我们要设计一个关于产品的API,他应该是这样的:

/products
/products/12345

第一个API用来返回所有的产品,第二个则用来返回特定的产品。

使用名词而不是动词

很多开发者会犯这个错误。他们大概忘了我们已经后HTTP的Methods来帮助我们表达动词的部分。不如,一个用来得到所有产品的的API应该是:

/products

而不是

/getAllProducts

使用正确的HTTP方法

RESTful API有不同的方法来标示这个API操作的类型:

  • GET-要从服务中得到某个或者一些数据
  • POST-要在服务中创建某个或者一些数据
  • PUT/PATCH-要更新服务中的某些已有的数据
  • DELETE-要删除一些服务中已有的数据

我们需要确保我们在对应的API上使用正确的HTTP方法。

使用复数

这个观点有一些争议。有些人喜欢在设计URL时使用复数而有些人认为保持单数更合适。比如

/products
/product

我个人喜欢使用复数。原因呢就是这样可以避免迷惑使用者这个API到底是要返回单个数据还是一个数据的集合。同时这样的设计也可以避免需要在Base URL叠放额外的参数,比如:/product/all

有些人可能不喜欢这个建议。那我的意见是至少你要在一个Project中保持命名的统一。

使用参数

有时候我们需要设计更复杂的API。这些API不止需要传入id,可能还要传入更复杂的参数。这时,我们就应该使用参数来设计API,比如:

  • /products?name='ABC' 就要比 /getProductsByName 要更好
  • /products?type='xyz' 就要比 /getProductsByType 要更好

这样你就可以避免使用很长的URL来表达自己的意图。设计变得更简洁。

使用合适的HTTP状态码

HTTP为我们提供了丰富的状态返回码。然而令人遗憾的是,我们大部分人只使用了其中的两个-200和500!这肯定不是一个很好的实践!一下就一些你可以马上实用的HTTP状态码:

  • 200 OK-这是HTTP中最常用的状态码。用来标示所请求的操作成功了。
  • 201 CREATED-这个状态码标示你使用POST操作所创建的资源创建成功了。
  • 202 ACCEPTED-这个标示服务器获得并认可了你发送请求。
  • 400 BAD REQUEST-这个则用来标示用户输入的数据有误。
  • 401 UNAUTHRORIZED/403 FORBINDDEN-这两个状态码用来告诉用户没有权限或者没有被授权进行所请求的操作。
  • 404 NOT FOUND-这个状态码用来告诉用户你想要寻找的资源并不存在。
  • 500 INTERNAL SERVER ERROR-你永远不应该显示的抛出这个异常。只有在系统异常出现时由系统自动抛出。
  • 502 BAD GATEWAY-如果从上游的服务中收到了任何异常或者不正确的响应,这是合适的选择。

使用版本

使用版本对于API来说是很重要的!不同的企业有不同使用版本的习惯。有些使用日期来表示版本。有些则使用查询参数来表示版本。我个人更喜欢把版本放到URL的前缀上。比如:

/v1/products
/v2/products

而且我会尽量避免使用小版本号/v1.2/products/。因为这样会让人觉得你的API会频繁的变化。同时,(.)这个点并不是能够很快的在URL中被看到。所以,还是越简单越好吧!

同时,保持版本的向前兼容是很重要的实践。这样即使你改变了API版本,你的客户也有足够的时间来跟进你所进行的变化。

使用分页(Pagination)

当一个API可能会返回巨量数据的时候,使用分页成为了必须。否则用户可能会使服务器崩溃。

We need to always keep in mind that the API design should be full proof and fool proof.

我推荐使用limit和offset这两个参数。比如,/products?limit=25&offset=50 同时你也要考虑设置一个默认的limit和offset。

支持的格式

选择合适的API响应信息的格式是很重要的。大多数现代应用都会使用JSON。你也应该使用JSON,除非你有一些旧时的需求要求你使用XML响应。

回复合适的错误代码

一个很好的实践就是保持一个服务错误信息的集合并加上合适的ID。比如,如果你使用过FACEBOOK的graph API,当产生错误时,它会给你返回:

{
"error": {
"message": "(#803) Some of the aliases you requested do not exist: products",
"type": "OAuthException",
"code": 803,
"fbtrace_id": "FOXX2AhLh80"
}
}

我也见过有些错误信息还会告诉用户如何应对这个错误。这也是一个很好的实践。

使用OPEN API SPECIFICATIONS

如果你也像我一样希望所有的团队都遵守统一的规则,你可以使用OPEN API Specification。Open API允许我们在设计好API后更加便捷的分享给客户或者其他团队。

总结

显而易见的,如果你想要更好的和客户或者其他团队沟通,API绝对是正确的方式。但如果API没有被很好的设计,反而会徒增别人(或者也有你自己?)的困惑。所以,请在设计阶段放入更多的心思。剩下的只不过就是实现而已了!


感谢您的阅读

如果你对设计API有更好的意见和建议,请在评论区分享出来吧!欢迎任何的反馈和纠错!谢谢!

[Medium翻译]RESTful API权威设计指南-设计更好的API的更多相关文章

  1. WP8.1学习系列(第十章)——中心控件Hub设计指南

    Windows Phone 应用商店应用中的中心控件指南   在本文中 说明 示例 用法指南 设计指南 相关主题 重要的 API Hub (XAML) HubSection (XAML) 说明 中心控 ...

  2. 理解RESTful架构——Restful API设计指南

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

  3. RESTful API 设计指南 (转)

    RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...

  4. RESTFul API设计指南及使用说明

    RESTFul API设计指南及使用说明 一. 协议 API与用户的通信协议,使用HTTP协议. 二. 域名 应尽量将API部署在专用域名之下(http://api.example.com) 也可以将 ...

  5. RESTful API 设计指南,RESTful API 设计最佳实践

    RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...

  6. Rest Framework简介 和 RESTful API 设计指南

    使用Django Rest Framework之前我们要先知道,它是什么,能干什么用? Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Res ...

  7. (转载) RESTful API 设计指南

    作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...

  8. RESTful API 设计指南

    转自:http://www.ruanyifeng.com/blog/2014/05/restful_api.html 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机. ...

  9. RESTful API设计指南

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

随机推荐

  1. Grunt实践之简易教程

    以前自己太low了,都没用过高大上的前端自动化打包工具,开发方式也是偏传统的.加入到新的团队后得拼命赶上啊,前端技术更迭太快,各种技术层出不穷,智商都快不够用了.看人家都用的牛逼哄哄的技术,自己还守着 ...

  2. Revit

    log file Windows Vista or Windows 7:%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit 2016\Journals

  3. Android Studio图形基础(AS开发实战第二章学习笔记)

    图形基础 一.drawable 在代码中引用drawable文件可分为两种情况 (1)使用setBackgroundResource和setImageResource方法,可直接在参数中指定drawa ...

  4. 动态注册broadcast的安全考虑

    一.android service通知activity更新方式有1. service 通过广播的形式发送broadcast,向这个activity的内部类发广播的消息来更新界面2. service直接 ...

  5. DELPHI SOKET 编程--使用TServerSocket和TClientSocket

    本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...

  6. 使用 Azure CLI 2.0 从自定义磁盘创建 Linux VM

    本文说明如何在 Azure 中上传自定义的虚拟硬盘 (VHD) 或复制现有 VHD,并从自定义磁盘创建 Linux 虚拟机 (VM). 可以根据要求安装并配置 Linux 分发版,并使用该 VHD 快 ...

  7. percona toolkit之slave工具

    1:pt-slave-find ,主要是查找MySQL的层级,其实我感觉这个用处不是很大,因为层级比较多架构本身就很少,查看从库的话一般情况我们可以通过show slave hosts查看(不过不能显 ...

  8. 放弃setInterval-说说定时器

    上述事件循环机制的核心是:JS引擎线程和事件触发线程 但事件上,里面还有一些隐藏细节,譬如调用setTimeout后,是如何等待特定时间后才添加到事件队列中的? 是JS引擎检测的么?当然不是了.它是由 ...

  9. Python学习---深浅拷贝的学习

    浅拷贝copy(): 修改字符串,原来的不变: 更改列表,2个同时修改,以为列表里面还涉及一个指针的索引. 简单讲就是copy()只是简单地copy了第一层,第二层不被copy 深拷贝:  需要单独的 ...

  10. 初识java——Java程序的历史、开发和运行

    上了一节Java试听课,整理出如下笔记.     Java最新版本下载 http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...