使用Web API為應(yīng)用程序的開發(fā)者提供服務(wù)是軟件工程師具成就的工作之一。但是如何創(chuàng)造一個(gè)具有活躍開發(fā)者生態(tài)系統(tǒng)的、受歡迎的API,也是軟件工程師具挑戰(zhàn)的工作之一。有了這本實(shí)用指南,開發(fā)者、產(chǎn)品經(jīng)理、架構(gòu)師、開發(fā)相關(guān)專業(yè)人員和技術(shù)領(lǐng)導(dǎo)都能夠從中學(xué)習(xí)如何在設(shè)計(jì)、擴(kuò)展、營銷和持續(xù)開發(fā)可交互操作的API的復(fù)雜決策過程中找到正確的方向。
構(gòu)建一個(gè)受歡迎的開發(fā)者平臺(tái)和一個(gè)被數(shù)百萬開發(fā)者使用的API是一名軟件工程師在職業(yè)生涯中最具挑戰(zhàn)和最具成就的工作之一。你將在本書中學(xué)會(huì)如何完成這一工作。API是現(xiàn)代軟件開發(fā)的核心。它為開發(fā)者解決了一個(gè)常見的難題:作為一名軟件工程師,如何將自己的代碼公開給其他開發(fā)者去使用,以及如何讓他們基于自己的代碼進(jìn)行創(chuàng)新。現(xiàn)代軟件開發(fā)的過程非常像搭建樂高積木。作為開發(fā)者,你可以訪問大量提供公開服務(wù)的API,這些服務(wù)涵蓋支付、通信、授權(quán)和身份認(rèn)證等領(lǐng)域。在構(gòu)建一個(gè)新的軟件時(shí),軟件工程師的工作就是使用這些API來組合新產(chǎn)品,重用他人的代碼可以大大節(jié)省自己的時(shí)間,并且可以避免一些重復(fù)造輪子的工作。很多軟件工程師在小時(shí)候很喜歡玩樂高,長大后依然如此。誰又不愛玩樂高呢?畢竟樂高那么有趣,可以使用那些彼此無縫連接的彩色碎片拼接出滿意的東西。但是如果可以自己創(chuàng)建樂高積木本身呢?如果不僅可以創(chuàng)建樂高套件,還可以創(chuàng)建樂高零件本身,并讓其他人基于你的成果進(jìn)行創(chuàng)新,那不更好嗎?在你構(gòu)建自己的API時(shí),實(shí)際上就是在為其他開發(fā)者創(chuàng)建你自己的樂高零件。API在計(jì)算機(jī)科學(xué)領(lǐng)域并不算什么新概念,早在20世紀(jì)60年代,一些開發(fā)者就開始為第一種編程語言構(gòu)建開發(fā)者之間共享的標(biāo)準(zhǔn)庫,讓其他開發(fā)者可以在不知道標(biāo)準(zhǔn)庫內(nèi)部代碼的情況下使用這些標(biāo)準(zhǔn)庫提供的功能。在20世紀(jì)70年代和20世紀(jì)80年代,隨著網(wǎng)絡(luò)的誕生,計(jì)算機(jī)之間開始相互連接,第一個(gè)網(wǎng)絡(luò)API隨之出現(xiàn),開發(fā)者們開始通過遠(yuǎn)程過程調(diào)用(Remote Procedure Call,RPC)的方式調(diào)用網(wǎng)絡(luò)API所暴露出來的一些服務(wù)。有了遠(yuǎn)程過程調(diào)用,開發(fā)者們開始通過網(wǎng)絡(luò)提供功能和調(diào)用遠(yuǎn)程庫,就像使用本地資源一樣。像Java這樣的編程語言提供了進(jìn)一步的抽象和復(fù)雜度,它們使用消息中間件服務(wù)器來管理和組織這些遠(yuǎn)程服務(wù)。在20世紀(jì)90年代,隨著互聯(lián)網(wǎng)的興起,許多公司希望標(biāo)準(zhǔn)化構(gòu)建和公開API的方式。例如,Microsoft的公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)(Common Object Request Broker Architecture,CORBA)、組件對(duì)象模型(Component Object Model,COM)和分布式組件對(duì)象模型(Distributed Component Object Model,DCOM)等標(biāo)準(zhǔn)都試圖成為在網(wǎng)絡(luò)上提供服務(wù)的一種可執(zhí)行的標(biāo)準(zhǔn)。但問題是這些標(biāo)準(zhǔn)大多數(shù)管理起來很復(fù)雜,并且要求在網(wǎng)絡(luò)的兩端使用類似的編程語言,有時(shí)還需要在本地安裝部分遠(yuǎn)程服務(wù)(通常稱為樁代碼Stub)才能進(jìn)行訪問。這種情況可以說是一團(tuán)糟;ヂ(lián)統(tǒng)一的夢(mèng)想很快變成了配置和限制的噩夢(mèng)。在20世紀(jì)90年代末期和21世紀(jì)早期,通過網(wǎng)絡(luò)應(yīng)用程序接口(Web API)訪問遠(yuǎn)程服務(wù)的方式成為一種更加開放和標(biāo)準(zhǔn)的方式。首先是簡單對(duì)象訪問協(xié)議(Simple Object Access Protocol,SOAP)和可擴(kuò)展標(biāo)記語言(Extensible Markup Language,XML)得到了廣泛使用;然后,表現(xiàn)層狀態(tài)轉(zhuǎn)換(Representational State Transfer,REST)和JavaScript對(duì)象表示法(JavaScript Object Notation,JSON)開始流行,這些技術(shù)使訪問遠(yuǎn)程服務(wù)變得更加容易和標(biāo)準(zhǔn)化,而且不依賴于任何客戶端代碼或編程語言。我們將在本書中介紹這些比較受歡迎和有用的技術(shù)。
[美]布倫達(dá)·金(Brenda jin)是一位企業(yè)家和軟件工程師。作為Slack開發(fā)者平臺(tái)團(tuán)隊(duì)的一名工程師,她的工作是為第三方開發(fā)者設(shè)計(jì)、構(gòu)建和擴(kuò)展API。作為GirlDevelop It的董事會(huì)成員和分會(huì)負(fù)責(zé)人,Brenda為眾多開源教材做出了貢獻(xiàn),并使數(shù)千名女性有能力學(xué)習(xí)網(wǎng)絡(luò)和軟件開發(fā)。
蘇拉布·薩尼(Saurabh Sahni)是Slack開發(fā)者平臺(tái)團(tuán)隊(duì)的一名工程師。在過去的八年中,他一直在構(gòu)建和設(shè)計(jì)開發(fā)者平臺(tái)和API。在Slack工作之前,Saurabh領(lǐng)導(dǎo)了一個(gè)負(fù)責(zé)Yahoo!開發(fā)者網(wǎng)絡(luò)基礎(chǔ)架構(gòu)和開發(fā)者工具的工程師團(tuán)隊(duì),在那里他幫助推出了Yahoo!移動(dòng)開發(fā)者組件和一些API。
埃米爾·舍瓦特是Twitch的開發(fā)者經(jīng)驗(yàn)副總裁。過去15年來,他一直在Slack、Microsoft和Google圍繞API構(gòu)建開發(fā)者產(chǎn)品、API和生態(tài)系統(tǒng)。他也是《Designing Bots》(O'Reilly)的作者。
前言
第1章 什么是API
為什么我們需要API
誰是我們的用戶
API的商業(yè)案例
內(nèi)部開發(fā)者優(yōu)先使用,外部開發(fā)者次之的API
外部開發(fā)者優(yōu)先使用,內(nèi)部開發(fā)者次之的API
作為產(chǎn)品的API
如何讓API更出色
小結(jié)
第2章 API范式
請(qǐng)求一響應(yīng)式API
表現(xiàn)層狀態(tài)轉(zhuǎn)換REST
遠(yuǎn)程過程調(diào)用RPC
GraphQL
事件驅(qū)動(dòng)式API
WebHOOkS
WebSOCket
HTTP Streaming
小結(jié)
第3章 API安全
身份認(rèn)證和授權(quán)
OAUth
令牌生成
權(quán)限范圍
令牌和權(quán)限范圍驗(yàn)證
令牌過期和令牌刷新
展示和撤銷授權(quán)
OAuth最佳實(shí)踐
WebHooks安全
令牌驗(yàn)證
請(qǐng)求簽名和WebHooks簽名
雙向傳輸層安全
精簡負(fù)載和API獲取
WebHooks安全最佳實(shí)踐
小結(jié)
第4章 設(shè)計(jì)最佳實(shí)踐
基于真實(shí)用例而設(shè)計(jì)
設(shè)計(jì)出色的開發(fā)者體驗(yàn)
使API能快速而輕松地入門
保持一致性
簡化故障排除過程
讓你的API可擴(kuò)展
小結(jié)
第5章 設(shè)計(jì)實(shí)踐
場(chǎng)景
定義業(yè)務(wù)目標(biāo)
概述關(guān)鍵用例
……
第6章 擴(kuò)展API
第7章 管理更新
第8章 構(gòu)建開發(fā)者生態(tài)系統(tǒng)
第9章 開發(fā)者資源
第10章 開發(fā)者計(jì)劃
第11章 總結(jié)
附錄 API設(shè)計(jì)工作表
作者介紹
封面介紹