矽谷之路109 Google最新面試真題:如何設計一個魯棒的RestAPI

首先是內推福利,如果你想獲得北美數百家公司的內推,加我微信:zhaxisangbo(註明內推)

最近一個月內CS501、CS502和CS504三門課的學員遇到了這道題目。這是一道非常普適的題目,不僅可以單獨考,而且可以混搭在各類系統設計和項目題中去評估你的水平。

談到設計API,我想起來幾天前和Twitter的Manager,也是Twitter Heron的作者之一的符茂松一起聊起了Spark的API設計。他提出了一個有趣的觀點:「Spark的API設計過於追求數學美感,因此不會給你那些用起來接地氣,但是看起來有些ugly的API,於是並不是那麼好用。」一語中的,我們進而也聊起了Spark發展過程中遇到的一些潛在困局,有機會單獨寫篇文章和大家分享。

一個務實的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這個關鍵節點,也有助於我們理解整個數據的流動,從而給出更好的系統設計。

一個小知識,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期,謝謝各位鼓勵我的朋友。如果你真的能從我的文章中學到點知識,那也隨手點個贊支持我一下吧。

推薦閱讀:

大學期間社團活動經歷對於找工作和實習有多少作用?
出手就拿到offer的方法,全部告訴你——公司實例篇
訪談 | 在LinkedIn做data scientist是一種怎樣的體驗?
簡歷中應該提自己完成的MOOC課程么?
網易雲課堂的產品經理微專業怎麼樣?

TAG:求职 | 面试 | 程序员 |