有一種說法,golang 編寫的 API 不能像其他語言那樣簡單和通用。但實際上,我遇到很多 REST API 的代碼,非常多的抽象,使得代碼庫變得混亂和復雜,最終傷害了可讀性和可維護性。
這一系列,我們將通過如何建立一個產(chǎn)品級的 REST API TODO 列表,一個可持續(xù)擴展架構(gòu),從路由和代碼接口開始,然后添加一個 mongo 的數(shù)據(jù)庫和一個 badger 數(shù)據(jù)層,然后是授權(quán)協(xié)議層(OAuth 2.0)
在這一系列中我們將使用 chi 路由。
為什么選擇用 Chi ,而不是用標準庫或者 Gin 或者 router-x 進行路由?
嗯,其實選擇用什么并不重要。無論你使用什么來進行路由,本系列中討論的概念都將是有用的。但是有下面的這些優(yōu)點可以讓我認為 Chi-router 比大多數(shù)替代方案更優(yōu)越:
-
和
net/http
標準庫 100% 兼容—可以在 Go 生態(tài)系統(tǒng)中使用任何與net / http 兼容的 http 或中間件 pkg -
專為模塊化/可組合 API 設計 – 中間件,內(nèi)聯(lián)中間件,路由組和子路由器安裝
-
沒有外部依賴—純粹的就是 Go 1.7+ stdlib + net / http
-
強悍?—?有很多公司正在使用,比如:Pressly,CloudFlare,Heroku,99Designs
-
輕量級?—?cloc'd in ~1000 LOC for the chi router
-
速度很快
我最喜歡的是,你為其他 net / http 兼容路由器編寫的舊的 http 處理程序和中間件也可以在正常運行。
讓我們開始吧
首先,我們創(chuàng)建一個 main.go 。我們程序的基礎(或者說中心元件 ?)
上面的代碼是一些最佳實踐的重點
- 用一個單獨的包來實現(xiàn)路由的邏輯,并將它們分好組,然后安裝(mount) 它們:
r.Mount("/api/todo", todo.Routes())
- 給 API 打上版本,這樣你就可以對 api 進行更新時,不會破壞舊的客戶端:
router.Route("/v1", ….)
- 使用中間件作為擴展。使用了非常多路由的代碼是非常笨重的,其實可以變成鏈接的中間件,像:授權(quán),設置響應頭部,壓縮,請求日志,限速等。
筆者(基于 Ajinkya 在評論中提到的問題,我會