溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Golang實(shí)現(xiàn)REST API架構(gòu)

發(fā)布時(shí)間:2020-06-19 12:55:43 來源:億速云 閱讀:725 作者:鴿子 欄目:編程語言

有一種說法,golang 編寫的 API 不能像其他語言那樣簡(jiǎn)單和通用。但實(shí)際上,我遇到很多 REST API 的代碼,非常多的抽象,使得代碼庫(kù)變得混亂和復(fù)雜,最終傷害了可讀性和可維護(hù)性。

這一系列,我們將通過如何建立一個(gè)產(chǎn)品級(jí)的 REST API TODO 列表,一個(gè)可持續(xù)擴(kuò)展架構(gòu),從路由和代碼接口開始,然后添加一個(gè) mongo 的數(shù)據(jù)庫(kù)和一個(gè) badger 數(shù)據(jù)層,然后是授權(quán)協(xié)議層(OAuth 2.0)

在這一系列中我們將使用 chi 路由。

Golang實(shí)現(xiàn)REST API架構(gòu)

為什么選擇用 Chi ,而不是用標(biāo)準(zhǔn)庫(kù)或者 Gin 或者 router-x 進(jìn)行路由?

嗯,其實(shí)選擇用什么并不重要。無論你使用什么來進(jìn)行路由,本系列中討論的概念都將是有用的。但是有下面的這些優(yōu)點(diǎn)可以讓我認(rèn)為 Chi-router 比大多數(shù)替代方案更優(yōu)越:

  • net/http 標(biāo)準(zhǔn)庫(kù) 100% 兼容---可以在 Go 生態(tài)系統(tǒng)中使用任何與net / http 兼容的 http 或中間件 pkg

  • 專為模塊化/可組合 API 設(shè)計(jì) - 中間件,內(nèi)聯(lián)中間件,路由組和子路由器安裝

  • 沒有外部依賴---純粹的就是 Go 1.7+ stdlib + net / http

  • 強(qiáng)悍?---?有很多公司正在使用,比如:Pressly,CloudFlare,Heroku,99Designs

  • 輕量級(jí)?---?cloc'd in ~1000 LOC for the chi router

  • 速度很快

我最喜歡的是,你為其他 net / http 兼容路由器編寫的舊的 http 處理程序和中間件也可以在正常運(yùn)行。

讓我們開始吧

首先,我們創(chuàng)建一個(gè) main.go 。我們程序的基礎(chǔ)(或者說中心元件 ?)

Golang實(shí)現(xiàn)REST API架構(gòu)

上面的代碼是一些最佳實(shí)踐的重點(diǎn)

  1. 用一個(gè)單獨(dú)的包來實(shí)現(xiàn)路由的邏輯,并將它們分好組,然后安裝(mount) 它們:

r.Mount("/api/todo", todo.Routes())

  1. 給 API 打上版本,這樣你就可以對(duì) api 進(jìn)行更新時(shí),不會(huì)破壞舊的客戶端:

router.Route("/v1", ....)

  1. 使用中間件作為擴(kuò)展。使用了非常多路由的代碼是非常笨重的,其實(shí)可以變成鏈接的中間件,像:授權(quán),設(shè)置響應(yīng)頭部,壓縮,請(qǐng)求日志,限速等。

筆者(基于 Ajinkya 在評(píng)論中提到的問題,我會(huì)更多的闡述 walk 方法):

chi 路由有一個(gè)方法叫做 walk。這個(gè)方法接收的參數(shù):

  • A router

  • A callback.

每個(gè)被定義的路由都會(huì)被回調(diào),并且接收 4 個(gè)參數(shù):

  • 路由定義的方法

  • 實(shí)際路由的字符串

  • 處理器(函數(shù)),處理給定路由的請(qǐng)求

  • 給定路由中,定義過的中間件列表(中間件是一個(gè)比較簡(jiǎn)單的函數(shù),它會(huì)在處理器被調(diào)用前調(diào)用,所以它們才會(huì)被使用在請(qǐng)求處理之前,授權(quán)等)

以我為例,我將簡(jiǎn)單地輪詢路由并且打印所有被定義的路由。從而讓我對(duì)所有可用的路由一目了然。

接下來我們構(gòu)建一個(gè) todo 包,它實(shí)際上保存了我們 todo 邏輯。

Golang實(shí)現(xiàn)REST API架構(gòu)

注意事項(xiàng)

  • todo 包有一個(gè)返回所有路由的方法。這些路由都是寫在 main.go 文件中。 實(shí)際上我通常會(huì)把這些路由寫在一個(gè)叫 routes.go 的文件中, 這樣會(huì)很容易在包里找到.

  • 處理程序具有 func (w http.ResponseWriter,r *http.Request) 的函數(shù)簽名,這意味著這處理程序和你使用標(biāo)準(zhǔn)庫(kù)的 net/http 寫法沒有不同。

  • 使用 render.JSON,一個(gè) encoding/json 的封裝, 它會(huì)自動(dòng)轉(zhuǎn)義你 JSON 響應(yīng)中所有的 html,并設(shè)置 content-type 為 application/json

你被它有多簡(jiǎn)單嚇到了嗎?可以在 GitHub 上查看這個(gè)項(xiàng)目 https://github.com/tonyalaribe/todoapi/tre....

在我們本系列的下篇文章中, 我們會(huì)繼續(xù)對(duì)配置和共享狀態(tài)的支持。 大多數(shù)項(xiàng)目通常都需要額外的配置,例如數(shù)據(jù)庫(kù)連接,等等。 我們將會(huì)在下篇文章里討論這個(gè)。

以上就是優(yōu)雅的實(shí)現(xiàn) Golang REST API 架構(gòu)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI