硅谷之路109 Google最新面试真题:如何设计一个鲁棒的RestAPI


(anaiw) #1

首先是内推福利,如果你想获得北美数百家公司的内推,加我微信:zhaxisangbo(注明内推)

最近一个月内CS501、CS502和CS504三门课的学员遇到了这道题目。这是一道非常普适的题目,不仅可以单独考,而且可以混搭在各类系统设计和项目题中去评估你的水平。

谈到设计API,我想起来几天前和Twitter的Manager,也是Twitter Heron的作者之一的符茂松一起聊起了Spark的API设计。他提出了一个有趣的观点:“Spark的API设计过于追求数学美感,因此不会给你那些用起来接地气,但是看起来有些ugly的API,于是并不是那么好用。”一语中的,我们进而也聊起了Spark发展过程中遇到的一些潜在困局,有机会单独写篇文章和大家分享。

![](data:image/svg+xml;utf8,)

一个务实的API有以下设计原则【1】:

  • API是开发者的用户界面 - 所以多花点功夫使其更友好

  • 使用RESTful的URL和action

  • 所有地方都要使用SSL,没有例外

  • 一个API的好用与否取决于它的文档 - 所以文档要好好写

  • 通过URL来控制版本,不要通过header

  • 使用查询参数来实现高级功能:过滤、排序和搜索

  • 提供方法用来限制从API返回的字段

  • 对于POST、PATCH和PUT的请求返回一些有用的东西

  • HATEOAS当前还不太实用

  • 尽量使用JSON,迫不得已的时候使用XML

  • 理论上你应该在JSON中使用驼峰格式,但是下划线格式的可读性比驼峰格式要高20%

  • 默认情况API要输出完整的内容,并且要确认支持gzip

  • 默认情况下不要在响应内容的外边再套一层大括号

  • 考虑对POST、PUT和PATCH等请求的body使用JSON格式

  • 使用Link header分页

  • 提供一种方法来自动加载相关资源的内容

  • 提供一种方法来覆盖HTTP方法

  • 提供响应header用来对请求频次进行限制

  • 使用token来进行普通验证,当需要用户授权的时候使用OAuth2

  • 要在响应header中包含缓存所使用的header

  • 定义一个容易理解的错误格式

  • 高效的使用HTTP状态码

其实,也有很多架构师和学者提出了API-First的设计思想【2】。究其本质,在整个系统设计的蓝图中,面向数据流是最主流的方法,而数据节点之间的沟通方式就是我们的API设计的起点。或者说抓住了API这个关键节点,也有助于我们理解整个数据的流动,从而给出更好的系统设计。

![](data:image/svg+xml;utf8,)

一个小知识,REST的来历是Resource Representational State Transfer,说白了就是资源、表现形式和状态变化。

进一步来说,在深入浅出REST的文章中,给出了五个核心原则【5】:

  • 为所有“事物”定义ID
  • 将所有事物链接在一起
  • **使用标准方法
    **
  • **资源多重表述
    **
  • 无状态通信

总结来说,REST提供了一套机器之间沟通并且人也能一眼看懂的语言。

我会在硅谷之路的免费直播中和大家深入剖析这道题目,现在想要深入学习的朋友,可以参考以下资料:

  1. 设计一个务实的RESTful API
  2. RESTful API 设计指南
  3. aisuhua/restful-api-design-references
  4. 怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful?
  5. 深入浅出REST

最后感叹一下硅谷之路终于写到了109期,谢谢各位鼓励我的朋友。如果你真的能从我的文章中学到点知识,那也随手点个赞支持我一下吧。