作為軟件開發(fā)人員,我們很難抗拒把自己的想法寫成代碼的沖動(dòng)。當(dāng)突然有了想法,我們的手指就無法控制,就行一群野獸一樣在鍵盤上瘋跑,想用最快的速度實(shí)現(xiàn)我們的想法。
盡管這種感覺特別爽,但是我們最好還是退一步思考下,特別是當(dāng)你創(chuàng)建的東西會(huì)被很多人使用,比如一些公共API。在此篇文章中,我講為大家說明為什么和如何去設(shè)計(jì)一個(gè)深思熟慮的API。
API(Application Program Interface)是一個(gè)用于定義應(yīng)用程序接口的通用術(shù)語,換句話說,就是人或者機(jī)器是如何與機(jī)器進(jìn)行交流的。在web開發(fā)領(lǐng)域,一個(gè)API就是一個(gè)站點(diǎn)回復(fù)客戶端請(qǐng)求的結(jié)構(gòu)化文本數(shù)據(jù)的途徑。
另一個(gè)被web開發(fā)者廣泛應(yīng)用的理念是 RESTFul Web API. 是由 Roy Fielding 定義,其作為一種架構(gòu)風(fēng)格,它提供了一個(gè)完善的客戶端和服務(wù)器之間的通信協(xié)議。它有一些限制: 無狀態(tài)通信,基于已有的技術(shù)(一般是HTTP),使用超媒體作為引擎狀態(tài)。
換句話說,它提出了一些構(gòu)建web API 的模式。為了簡單起見,本文引用的Web API都是簡單API。
一個(gè)JSON勝萬言(One JSON is worth a thousand words)
看一個(gè)API響應(yīng)的例子:
{
"data": [
{
"story": "Jonatas Baldin was writing a blog post.",
"created_time": "2017-15-01T00:02:57+0000",
"id": "624510964324764_1046909755418214"
},
]
}
這個(gè)數(shù)據(jù)片段叫JSON, 這是在智能手機(jī)上看到的一個(gè)Facebook的一個(gè)狀態(tài)消息,來自于 Facebook API,是不是相當(dāng)簡潔?
現(xiàn)象一下,如果你是一個(gè)負(fù)責(zé)這個(gè)API的Facebook工程師,突然你有一天你腦子一熱決定把id字段改成message_id. 可以想象,這么一個(gè)小小的改動(dòng),有可能讓Facebook崩潰。最終導(dǎo)致所有依賴之前結(jié)構(gòu)的設(shè)備不能收集和展示給用戶內(nèi)容,這是多么操蛋的一天。
好的,糟糕的和丑陋的(The good, the bad and the ugly)
一個(gè)糟糕的API設(shè)計(jì)早晚會(huì)引起問題:
缺乏一致性:一旦一個(gè)API的增長,要?jiǎng)?chuàng)建訪問點(diǎn)往往只是為了滿足緊急需求。
很難擴(kuò)展:遇到問題很難找到擴(kuò)展突破口。
很難學(xué)習(xí):學(xué)習(xí)曲線陡峭
性能問題:后來適配的API往往是性能瓶頸
API改變無休止: 總是第一次是對(duì)的,后面都不對(duì)。
API是程序和用戶之間的契約,當(dāng)突然改變的時(shí)候不能引起混亂,這個(gè)契約要有遠(yuǎn)見。這是設(shè)計(jì)的入口:一個(gè)計(jì)劃,一個(gè)公約,一個(gè)系統(tǒng)或者是一個(gè)可評(píng)估的交流。
原文