矽谷之路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提供了一套機器之間溝通並且人也能一眼看懂的語言。
我會在矽谷之路的免費直播中和大家深入剖析這道題目,現在想要深入學習的朋友,可以參考以下資料:
- 設計一個務實的RESTful API
- RESTful API 設計指南
- aisuhua/restful-api-design-references
- 怎樣用通俗的語言解釋什麼叫 REST,以及什麼是 RESTful?
- 深入淺出REST
最後感嘆一下矽谷之路終於寫到了109期,謝謝各位鼓勵我的朋友。如果你真的能從我的文章中學到點知識,那也隨手點個贊支持我一下吧。
推薦閱讀:
※大學期間社團活動經歷對於找工作和實習有多少作用?
※出手就拿到offer的方法,全部告訴你——公司實例篇
※訪談 | 在LinkedIn做data scientist是一種怎樣的體驗?
※簡歷中應該提自己完成的MOOC課程么?
※網易雲課堂的產品經理微專業怎麼樣?