API 設(shè)計的七大誤區(qū)

對于現(xiàn)在的絕大多數(shù)人來說临扮,網(wǎng)站和移動應(yīng)用已經(jīng)跟空氣和食物一樣成為生活的必需品诫惭。然而在網(wǎng)站和移動系統(tǒng)不斷演化的過程中窃祝,前后端分離是系統(tǒng)架構(gòu)演化的一個重要分水嶺。

隨著系統(tǒng)邏輯和展示層分離的過程中众旗,API 是一個實現(xiàn)這種分布式應(yīng)用架構(gòu)的重要機制罢杉,從早期單純的 WebService 到 RESTful,API 的設(shè)計方法逝钥、技術(shù)和理念發(fā)生了巨大的變化屑那。然而 API 的設(shè)計實在是陷阱重重拱镐,一不小心就會落入其中艘款,從而連累整個系統(tǒng)。

如果單純地考慮功能的話沃琅,大部分服務(wù)端開發(fā)工程師都可以設(shè)計和實現(xiàn)出一個說得過去的 API哗咆,但一旦有多個互相關(guān)聯(lián)的 API,或者當(dāng)系統(tǒng)壓力達到一定級別時益眉,就會有不少問題出現(xiàn)晌柬,甚至導(dǎo)致系統(tǒng)崩潰。

我們可以來看看常見的誤區(qū)在什么地方郭脂。

1年碘、API 就是 RESTful API

觀點:RESTful 是現(xiàn)在很流行的一種 API 設(shè)計風(fēng)格,有大量的文章在推薦這種方法展鸡,因此我們就需要按照這種風(fēng)格的要求來設(shè)計API屿衅,并且要實現(xiàn)全套的設(shè)計!

真相:完全不需要莹弊!

事實上 RESTful 只是一種設(shè)計思想涤久,并不存在具體必須遵守的規(guī)則涡尘。在不同的應(yīng)用系統(tǒng)中,API 承擔(dān)了不同的各種職責(zé)和功能响迂,針對不同的應(yīng)用場景可以使用相應(yīng)的規(guī)則考抄,適用就好。盡管有一些類似于Richardson成熟度模型這樣的理論蔗彤,但也都不是必須做到的川梅。雖然最高級別的成熟度是很有用的,但也要求整個系統(tǒng)以特定的方式運作然遏,對于絕大部分的系統(tǒng)來說挑势,低一些級別的成熟度一樣工作良好,并且同時不需要花費太大的代價啦鸣。

如果實現(xiàn)了比較完整的 RESTful API潮饱,那么會有一些好用的工具和代碼可以利用,但如果自己實現(xiàn)诫给,也未必會有很大的代價香拉。

2、API中狂,不過就是一段 Java 代碼么

觀點:API凫碌?不過就是一些 Java 代碼暴露一個 HTTP 地址么,找個會做 Java 的人上就行胃榕。

真相:大部分情況下都不是這樣的盛险。

這種說法,和“只要人會說話勋又,就能進行感人的演講”一樣可笑苦掘。

(圖樣圖森破)


軟件工具的使用只是一種簡單的技能,但在工具背后的思想是需要經(jīng)過經(jīng)驗的積累以及各種周邊知識的共同理解才能做到楔壤。

API 的設(shè)計與其說是一種技能鹤啡,不如說是一種藝術(shù),交流的藝術(shù)蹲嚣。除了代碼編寫以外递瑰,更多的是架構(gòu)上的設(shè)計。API 是整個服務(wù)端系統(tǒng)暴露到客戶端的接口隙畜,是所有業(yè)務(wù)邏輯提供給外部的界面抖部,如果對于系統(tǒng)的整體要求和架構(gòu)不了解,很難設(shè)計一個合用的 API 系統(tǒng)议惰。

3慎颗、和交互綁定的 API 設(shè)計

觀點:API 是給客戶端用的,在現(xiàn)在 App 大行其道的時候,移動端的同事說哗总,我們需要簡化網(wǎng)絡(luò)交互几颜,所以每個頁面只需要一個 API ——什么?我要調(diào)用8個 API讯屈?不行蛋哭,太慢了,只要一個涮母,把所有的數(shù)據(jù)都放在一起給我吧谆趾,謝謝!

真相:這樣的做法會導(dǎo)致 API 最終完全不可用叛本。

沒錯沪蓬,從性能的角度上看,確實這樣是比較好的来候,但是跷叉,有沒有想過,如果移動端頁面設(shè)計改變了怎么辦营搅?一旦增加或者減少這個頁面所需要的數(shù)據(jù)云挟,那么這個API 立刻就變得沒用了,重新設(shè)計一個转质?算了吧园欣,API 升級的代價太高了,于是越來越多的重復(fù) API 就出現(xiàn)了休蟹。

前后端分離的理念在于把業(yè)務(wù)邏輯和展示分離沸枯,API 作為業(yè)務(wù)邏輯的體現(xiàn),以業(yè)務(wù)邏輯作為設(shè)計原則赂弓,比靠攏易變的展示層要準(zhǔn)確和靠譜得多绑榴。從這個角度上說,引入一個中間層來適應(yīng)展示的變化會更加適合拣展。

4彭沼、我的 API 是我的缔逛,你的 API 是你的备埃,不互通的 API 設(shè)計

觀點:系統(tǒng) A 提供了一組 API,系統(tǒng) B褐奴,恩按脚,另外一個系統(tǒng),所以我們需要另外一組 API敦冬,但是辅搬,不好意思,我不知道 A 是怎么做的,并且我也不關(guān)心堪遂。

真相:這是一種系統(tǒng)分裂的征兆介蛉,是系統(tǒng)業(yè)務(wù)邏輯混亂的表現(xiàn)。

如果把應(yīng)用程序接口比做用戶接口的話溶褪,這樣的說法就很奇怪了币旧。作為一個公司下的不同系統(tǒng),長得完全不一樣猿妈,互相之間沒有任何關(guān)聯(lián)性吹菱,這樣用戶在使用的時候會很別扭。如果把系統(tǒng)當(dāng)成一個人彭则,這樣的設(shè)計就和這個人有兩張臉一樣奇怪鳍刷。作為系統(tǒng)的架構(gòu)師,要為全公司設(shè)定一個一致的API規(guī)范俯抖,程序員們對接入各個系統(tǒng)可以有明確的預(yù)期输瓜,并且非常有助于在系統(tǒng)和客戶端之間共享代碼,簡化開發(fā)和維護的成本芬萍。

5前痘、API = 數(shù)據(jù)庫

觀點:API 設(shè)計?簡單担忧,數(shù)據(jù)庫的操作映射一下好了芹缔。創(chuàng)建一個對象,修改一個對象瓶盛,刪除一個對象最欠,贊!API 設(shè)計的生活是如此簡單惩猫。

真相:等一下芝硬,作為API的使用者,客戶端應(yīng)用為什么需要知道數(shù)據(jù)庫轧房?難道不應(yīng)該是業(yè)務(wù)驅(qū)動的嗎拌阴?

很多 API 確實就是這樣設(shè)計的,但如果只是單純地按照數(shù)據(jù)庫的結(jié)構(gòu)進行設(shè)計奶镶,那么只能說是一個數(shù)據(jù)庫的訪問層而已迟赃,是SQL 語句的 HTTP 化…… 但 API應(yīng)當(dāng)反映的是業(yè)務(wù)內(nèi)在邏輯,包括業(yè)務(wù)對象厂镇、流程和業(yè)務(wù)數(shù)據(jù)纤壁,在基于數(shù)據(jù)庫的基礎(chǔ)上,通過服務(wù)器端的業(yè)務(wù)層處理后才是 API 應(yīng)當(dāng)?shù)慕Y(jié)果捺信。

6酌媒、我的自留地 API,API 不開放標(biāo)準(zhǔn)

觀點:我沒打算開放 API 給別人用,所以也不需要遵守什么標(biāo)準(zhǔn)秒咨。

真相:標(biāo)準(zhǔn)意味著通用喇辽,有更多的簡化。

話是不錯雨席,但標(biāo)準(zhǔn)的好處在于設(shè)定交流雙方的一個基礎(chǔ)茵臭,作為服務(wù)器對外的交流接口,API 始終是設(shè)計得給人用的舅世,不僅僅是公司內(nèi)部旦委,也有可能是外部;不僅僅是現(xiàn)在雏亚,也有可能是未來的人在使用缨硝。和代碼規(guī)范一樣,符合良好規(guī)范的 API 能夠極大地改善可讀性罢低、維護性查辩,即使不開放給外部,內(nèi)部交流也會獲益良多网持。

7宜岛、我不說,你就不知道功舀,API 的安全性

觀點這個 API 又沒有公開萍倡,所以不需要加密的。

真相:在這個互聯(lián)網(wǎng)上是沒有秘密的辟汰,所以你不讓人知道列敲,不代表別人不會知道。

關(guān)于安全帖汞,這個是 API 設(shè)計中非常重要的一個需求戴而,但很多 API 的設(shè)計師并不重視這個。最常見的借口就是這個翩蘸,我不告訴別人所意,誰也不知道。但事實上催首,API 作為交流的工具扶踊,即使服務(wù)端不容易被窺視,但大量的客戶端幾乎是不設(shè)防的翅帜。破解一個客戶端系統(tǒng)并不是一個多么困難的事情姻檀,因此了解這個 API 的調(diào)用也不是太復(fù)雜的事情。

此外涝滴,在網(wǎng)絡(luò)上的傳輸也是不安全的,中間人截獲信息的案例導(dǎo)致無數(shù)的系統(tǒng)被攻破。按照業(yè)界的推薦方法來設(shè)計 API 的安全傳輸功能歼疮,盡管開發(fā)的代價會略大一些杂抽,但遠(yuǎn)比自己自以為完美的設(shè)計安全得多。

寫在最后

隨著越來越多的人在使用互聯(lián)網(wǎng)韩脏,用戶界面(UX)設(shè)計的影響也越來越大缩麸,所有人都開始注重用戶界面設(shè)計的好壞部服,然而 API 是業(yè)務(wù)邏輯的用戶界面弄匕,是針對程序員的界面奥额,避免這些誤區(qū)陷阱可以讓這些界面更加友好焚志,在業(yè)務(wù)邏輯和展示層都能運作得更好先巴。

本文作者:徐翎 Andrew(點融黑幫)丸升,任職點融網(wǎng)客戶端開發(fā)總監(jiān)粗仓,組建了移動和網(wǎng)站的開發(fā)團隊譬挚,開發(fā)了點融網(wǎng)各款客戶端軟件空民。曾就職于微軟等公司刃唐,參與過包括Hotmail 和Windows 在內(nèi)的大型跨國際軟件開發(fā)項目的研發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末界轩,一起剝皮案震驚了整個濱河市画饥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浊猾,老刑警劉巖抖甘,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葫慎,居然都是意外死亡单山,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門幅疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米奸,“玉大人,你說我怎么就攤上這事爽篷°参” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵逐工,是天一觀的道長铡溪。 經(jīng)常有香客問我,道長泪喊,這世上最難降的妖魔是什么棕硫? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮袒啼,結(jié)果婚禮上哈扮,老公的妹妹穿的比我還像新娘纬纪。我一直安慰自己,他們只是感情好滑肉,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布包各。 她就那樣靜靜地躺著,像睡著了一般靶庙。 火紅的嫁衣襯著肌膚如雪问畅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天六荒,我揣著相機與錄音护姆,去河邊找鬼。 笑死掏击,一個胖子當(dāng)著我的面吹牛卵皂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铐料,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渐裂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钠惩?” 一聲冷哼從身側(cè)響起柒凉,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篓跛,沒想到半個月后膝捞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡愧沟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年蔬咬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沐寺。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡林艘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出混坞,到底是詐尸還是另有隱情狐援,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布究孕,位于F島的核電站啥酱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厨诸。R本人自食惡果不足惜镶殷,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望微酬。 院中可真熱鬧绘趋,春花似錦颤陶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忙上。三九已至拷呆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疫粥,已是汗流浹背茬斧。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梗逮,地道東北人项秉。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像慷彤,于是被迫代替她去往敵國和親娄蔼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容