對于現(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ā)。