如何使用AWS HTTP API創(chuàng)建API代理網(wǎng)關(guān)
將這些服務(wù)整合在一起時(shí),安全性也同樣重要。因此,有意義地設(shè)計(jì)應(yīng)用程序至關(guān)重要,這樣可以最大程度地減少不同系統(tǒng)之間的摩擦。
本文重點(diǎn)討論客戶端和其他后端服務(wù)之間的通信 - 無(wú)論是無(wú)服務(wù)器功能還是第三方 API。
無(wú)論您是開發(fā)人員、架構(gòu)師還是技術(shù)愛好者,本教程都將為您提供設(shè)置強(qiáng)大且可擴(kuò)展的 API 網(wǎng)關(guān)的知識(shí)和技能,從而簡(jiǎn)化客戶端和后端服務(wù)之間的通信。
(更|多優(yōu)質(zhì)內(nèi)|容:java567 點(diǎn) c0m)
基礎(chǔ)知識(shí)的簡(jiǎn)要回顧
在我們深入研究并了解 AWS HTTP API 簡(jiǎn)化 API 集成流程的潛力之前,讓我們快速回顧一下基本術(shù)語(yǔ)。
你們中的許多人可能了解 API 和代理網(wǎng)關(guān)是什么。也就是說,當(dāng)我們深入研究這些概念并試圖理解本質(zhì)細(xì)節(jié)和差異時(shí),事情可能會(huì)變得有點(diǎn)令人生畏。
API(應(yīng)用程序編程接口)是一種抽象,允許兩個(gè)程序相互通信。API 可以是 API 服務(wù)提供商以包或端點(diǎn)的形式公開的方法,通過該端點(diǎn)可以傳輸信息(REST API)。
代理網(wǎng)關(guān)是將傳入請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo) URI 的網(wǎng)關(guān),而常規(guī)網(wǎng)關(guān)在客戶端和服務(wù)器之間來(lái)回發(fā)送信息。
代理網(wǎng)關(guān)也是屏蔽目標(biāo) URI 和 API 密鑰的好方法,否則如果直接從前端(瀏覽器)進(jìn)行網(wǎng)絡(luò)調(diào)用,這些目標(biāo) URI 和 API 密鑰就會(huì)暴露。
HTTP API 與 REST API – 有什么區(qū)別?
從技術(shù)上講,不存在“HTTP API”——這是 AWS 特有的。
在 AWS 上創(chuàng)建 API 網(wǎng)關(guān)時(shí),您可以創(chuàng)建 HTTP API 或 REST API。兩者之間的區(qū)別在于,后者在設(shè)計(jì) API 時(shí)提供了更大的靈活性,例如每個(gè)客戶端限制、請(qǐng)求驗(yàn)證、專用端點(diǎn)等。
為什么選擇 HTTP API 而不是 REST API?
如上所述,與 HTTP API 相比,REST API 提供了更大的靈活性和更細(xì)粒度的配置來(lái)設(shè)置 API。那么您為什么要使用 HTTP API 呢?
嗯,這并不總是與有多種選項(xiàng)可供選擇的靈活性有關(guān)——除非要求是具體的,否則在選擇正確的選項(xiàng)集時(shí)這通常會(huì)增加噪音。
另一方面,HTTP API 附帶有限的配置選項(xiàng),這可以幫助您以最少的決策構(gòu)建 API。
HTTP API 的另一個(gè)優(yōu)點(diǎn)是,它允許您將 JWT 授權(quán)者添加到網(wǎng)關(guān),這是 REST API 中不存在的。
如果您在應(yīng)用程序中使用第三方身份驗(yàn)證系統(tǒng),則使用 JWT 授權(quán)程序來(lái)保護(hù)您的 API 端點(diǎn)是有意義的。
最后,HTTP API 比 REST API 更便宜。
看看顯著特征,您應(yīng)該選擇兩者中的哪一個(gè)完全取決于您的要求。但模糊地說,HTTP API 對(duì)于小型、非業(yè)務(wù)關(guān)鍵型應(yīng)用程序來(lái)說是一個(gè)不錯(cuò)的選擇。
如何創(chuàng)建 HTTP 代理網(wǎng)關(guān)并與目標(biāo) URI 集成
是時(shí)候讓我們動(dòng)手了。
導(dǎo)航到您的 AWS 控制臺(tái)并搜索“API Gateway”。
在 AWS 控制臺(tái)上找到 API Gateway
單擊“創(chuàng)建 API”將向您顯示各種可用的 API 類型。單擊 HTTP API 上的“構(gòu)建”。
在 HTTP API 上選擇“構(gòu)建”
輸入 API 名稱并單擊“審核并創(chuàng)建”?;蛘?,您可以輸入其他必需的配置信息,但暫時(shí)忽略它,我們將在下面詳細(xì)介紹配置。
創(chuàng)建安全代理網(wǎng)關(guān)分為 3 個(gè)部分:
定義路線
添加集成
附加授權(quán)者
讓我們更詳細(xì)地討論每一項(xiàng)。
如何定義路線
路由是與資源操作或目標(biāo) URI 相對(duì)應(yīng)的路徑端點(diǎn)。
通過在路由中定義路徑變量,可以將動(dòng)態(tài)值發(fā)送到路由。路徑變量是通過在路徑變量周圍添加花括號(hào)來(lái)定義的,如下所示:/getmusic/{track}。
上面的路由中 ?{track}是可以用任何值替換的路徑變量。
一條路由可以有任意數(shù)量的路徑變量。但是,重要的是要知道查詢參數(shù)不能添加到路由定義中。
定義API代理網(wǎng)關(guān)的路由
還要確保為定義的路線選擇適當(dāng)?shù)姆椒?。為了?jiǎn)單起見,您可以考慮使用“GET”。
如何添加集成
這可能是創(chuàng)建代理網(wǎng)關(guān)中最重要的步驟。
這里具有挑戰(zhàn)性的部分是在傳入和傳出請(qǐng)求之間創(chuàng)建動(dòng)態(tài)值的正確映射。令人驚訝的是,沒有任何教程、文檔或指南來(lái)解決這個(gè)問題,所以我希望這會(huì)有所幫助。
單擊新定義的路由的方法后,您可以在右側(cè)窗格中看到路由詳細(xì)信息。
您可能會(huì)注意到該路線沒有附加任何集成。單擊“附加集成”,然后單擊“創(chuàng)建并附加集成”。
創(chuàng)建并附加集成屏幕
在集成類型中,選擇“HTTP URI”,因?yàn)槲覀兊哪繕?biāo)是創(chuàng)建一個(gè)代理網(wǎng)關(guān),將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)第三方 API。
從選項(xiàng)中選擇“HTTP URI”
輸入您的目標(biāo) URI 并選擇與傳入請(qǐng)求相同的方法,以便使用適當(dāng)?shù)姆椒ㄞD(zhuǎn)發(fā)請(qǐng)求。
注意:在目標(biāo) URI 中,您應(yīng)該僅添加 API 的域,而不是帶有查詢參數(shù)的整個(gè)路徑,因?yàn)檫@是我們將通過參數(shù)映射構(gòu)建的內(nèi)容。
例如,假設(shè)我們想按曲目名稱獲取曲目列表。
在這種情況下,您的輸入端點(diǎn)可能是:
?/getmusic/{track}
根據(jù)您使用的第三方 API,目標(biāo) URI 可能類似于:
?http://api.musixmatch.com/ws/1.1/track.search?q_track={track}
我們的目標(biāo)是確保為track路徑變量發(fā)送的值正確替換為傳出請(qǐng)求的查詢參數(shù)中的實(shí)際值。
奇怪的是,如果我們將目標(biāo) URI 定義為/ws/1.1/track.search?q_track={track},該{track}變量不會(huì)被實(shí)際值替換。
相反,文本字符串{track}按查詢參數(shù)值的原樣發(fā)送,無(wú)論您請(qǐng)求什么,都會(huì)獲取相同的錯(cuò)誤結(jié)果集。
為了避免這個(gè)陷阱,我們不在目標(biāo) URI 中定義完整路徑。
如您所見,在集成詳細(xì)信息部分下方,有一個(gè)參數(shù)映射規(guī)則,目前為空。單擊“創(chuàng)建”開始添加映射規(guī)則。
接下來(lái),選擇映射類型為“所有傳入請(qǐng)求”,然后選擇“添加新映射”。
為了創(chuàng)建映射規(guī)則,您需要注意以下三件事:
應(yīng)該修改什么
應(yīng)該如何修改
修改后的值應(yīng)該是多少
應(yīng)該修改什么?通常,所有 API 端點(diǎn)都會(huì)有一個(gè)以域部分為后綴的路徑,例如v1/,這在我們的代理網(wǎng)關(guān)端點(diǎn)中是多余的。所以我們想從覆蓋路徑開始。
該值是靜態(tài)類型的值,以符合 URI 路徑。
以上述API為例,該值應(yīng)為:
?/ws/1.1/track.search
URI 的動(dòng)態(tài)部分是軌道值,它是查詢參數(shù)。
接下來(lái),我們需要附加一個(gè)保存動(dòng)態(tài)值的查詢參數(shù)。
為此,請(qǐng)單擊“添加新映射”并選擇querystring.<querystring_name>要修改的參數(shù),然后選擇“附加”。
在值輸入字段中,輸入$request.path.track傳入{track}請(qǐng)求中的路徑變量名稱。有關(guān)語(yǔ)法的更多信息,請(qǐng)參閱 AWS 的此文檔。
總而言之,您的映射規(guī)則現(xiàn)在應(yīng)該如下所示:
參數(shù)映射規(guī)則
單擊“創(chuàng)建”,現(xiàn)在您的 API 代理網(wǎng)關(guān)應(yīng)該可以使用了。耶!
您可以通過將查詢字符串作為新映射附加到路徑來(lái)類似地附加其他查詢參數(shù)。例如,API 密鑰通常作為查詢參數(shù)發(fā)送。
此外,還可以在傳出請(qǐng)求中發(fā)送標(biāo)頭和正文。
如何附加授權(quán)者
盡管在測(cè)試 API 網(wǎng)關(guān)時(shí)附加授權(quán)者不是強(qiáng)制性的,但絕對(duì)建議在生產(chǎn)中保護(hù)它們。
如果您使用的是 Google Authenticator 等第三方身份驗(yàn)證服務(wù)或類似服務(wù),HTTP API 網(wǎng)關(guān)提供了一種基于 JWT 令牌管理路由授權(quán)的簡(jiǎn)單方法。
從左側(cè)菜單導(dǎo)航到“授權(quán)”頁(yè)面,然后單擊“創(chuàng)建并附加授權(quán)人”。默認(rèn)情況下,“授權(quán)者類型”選擇為 JWT。
輸入所需的信息,例如名稱、發(fā)行者 URL 和受眾。值和格式根據(jù)您使用的身份驗(yàn)證服務(wù)而有所不同。
包起來(lái)
本文的關(guān)鍵在于強(qiáng)調(diào)使用參數(shù)映射構(gòu)建路徑,而不是直接在路徑中定義路徑并期望奇跡發(fā)生。
我注意到的一個(gè)缺點(diǎn)是,當(dāng)外出請(qǐng)求中定義了多個(gè)路徑變量時(shí),參數(shù)映射不起作用。因此,確保傳出請(qǐng)求最多具有一個(gè)路徑參數(shù)非常重要。
HTTP API 網(wǎng)關(guān)是一種以最少的配置設(shè)置代理/非代理網(wǎng)關(guān)的快速、簡(jiǎn)單的方法。
就這樣,伙計(jì)們!我希望這可以幫助您獲得一些有關(guān)創(chuàng)建 HTTP API 網(wǎng)關(guān)和使用參數(shù)映射構(gòu)建路徑的知識(shí)。與可能有興趣閱讀本文的朋友和熟人分享。