中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang實現REST API架構

發布時間:2020-06-19 12:55:43 來源:億速云 閱讀:726 作者:鴿子 欄目:編程語言

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

這一系列,我們將通過如何建立一個產品級的 REST API TODO 列表,一個可持續擴展架構,從路由和代碼接口開始,然后添加一個 mongo 的數據庫和一個 badger 數據層,然后是授權協議層(OAuth 2.0)

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

Golang實現REST API架構

為什么選擇用 Chi ,而不是用標準庫或者 Gin 或者 router-x 進行路由?

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

  • net/http 標準庫 100% 兼容---可以在 Go 生態系統中使用任何與net / http 兼容的 http 或中間件 pkg

  • 專為模塊化/可組合 API 設計 - 中間件,內聯中間件,路由組和子路由器安裝

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

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

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

  • 速度很快

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

讓我們開始吧

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

Golang實現REST API架構

上面的代碼是一些最佳實踐的重點

  1. 用一個單獨的包來實現路由的邏輯,并將它們分好組,然后安裝(mount) 它們:

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

  1. 給 API 打上版本,這樣你就可以對 api 進行更新時,不會破壞舊的客戶端:

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

  1. 使用中間件作為擴展。使用了非常多路由的代碼是非常笨重的,其實可以變成鏈接的中間件,像:授權,設置響應頭部,壓縮,請求日志,限速等。

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

chi 路由有一個方法叫做 walk。這個方法接收的參數:

  • A router

  • A callback.

每個被定義的路由都會被回調,并且接收 4 個參數:

  • 路由定義的方法

  • 實際路由的字符串

  • 處理器(函數),處理給定路由的請求

  • 給定路由中,定義過的中間件列表(中間件是一個比較簡單的函數,它會在處理器被調用前調用,所以它們才會被使用在請求處理之前,授權等)

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

接下來我們構建一個 todo 包,它實際上保存了我們 todo 邏輯。

Golang實現REST API架構

注意事項

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

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

  • 使用 render.JSON,一個 encoding/json 的封裝, 它會自動轉義你 JSON 響應中所有的 html,并設置 content-type 為 application/json

你被它有多簡單嚇到了嗎?可以在 GitHub 上查看這個項目 https://github.com/tonyalaribe/todoapi/tre....

在我們本系列的下篇文章中, 我們會繼續對配置和共享狀態的支持。 大多數項目通常都需要額外的配置,例如數據庫連接,等等。 我們將會在下篇文章里討論這個。

以上就是優雅的實現 Golang REST API 架構的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漠河县| 白银市| 河东区| 庆安县| 沾益县| 北流市| 高密市| 咸丰县| 奉化市| 长丰县| 滦南县| 金川县| 湖口县| 萨迦县| 襄樊市| 宝清县| 永川市| 彩票| 灵宝市| 普兰店市| 德昌县| 金昌市| 平阴县| 巫溪县| 安图县| 雅安市| 大足县| 昌宁县| 淳化县| 北川| 石柱| 哈巴河县| 中卫市| 新平| 浠水县| 鹤壁市| 沁源县| 临漳县| 桃源县| 浑源县| 景泰县|