iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

Techschool Goalng Backend Master Class 的學習記錄系列 第 18

[Day 18] Implement RESTful in GO using Gin Part 1

  • 分享至 

  • xImage
  •  

Go web frameworks and HTTP routers

雖然我們可以使用標準的**net/http**套件來實現這些API,但使用現有的網頁框架會更容易,

它們提供了大量的功能,例如routing, parameter binding, validation, middleware,其中一些甚至內置了ORM。

以下是按其GitHub Stars數量排序的一些最受歡迎的Golang Web Frameworks與Routers:

https://ithelp.ithome.com.tw/upload/images/20231003/20121746MrJItv0omg.png

Gin : A HTTP web framework written in Go

Install Gin

go get -u github.com/gin-gonic/gin

Define server struct

現在,我們要創建一個名為 api 的新資料夾。接著,在其中創建一個名為 server.go 的新檔案。我們將在這裡實現我們的HTTP API伺服器。

首先,讓我們定義一個新的 Server 結構。此 Server 將為我們的banking service處理所有HTTP Request。它將有兩個欄位:

  • 第一個是我們在先前課程中已實現的 db.Store。當處理來自客戶端的API請求時,它將允許我們與資料庫進行互動。
  • 第二個欄位是類型為 gin.Engine 的router。此router將幫助我們將每個API請求傳送到正確的處理程序進行處理。
api/**server.go**

package api

import (
	db "github.com/Kcih4518/simpleBank_2023/db/sqlc"
	"github.com/gin-gonic/gin"
)

type Server struct {
	store  *db.Store
	router *gin.Engine
}

func NewServer(store *db.Store) *Server {
	server := &Server{store: store}
	router := gin.Default()

	// TODO: add routes to router

	server.router = router
	return server
}

Q & A:

  1. 為何在NewServerrouter不會是隨著server作為參數傳入,而是在NewServer中進行初始化?

    1. 分離關注點:此設計將資料存儲和路由處理分開。只需要專注於提供資料存儲(store),而路由的初始化和配置可以在**Server**結構體或其方法中完成。
    2. 彈性:如果將來需要更多的自定義配置,可以在**NewServer函數中或其他Server的方法中修改router**的初始化和配置。
  2. gin.Default()是什麼呢?

    1. **gin.Default()**是Gin框架中用於建立一個帶有預設middleware的router engine

    2. gin.Default() 函數會將 LoggerRecovery 中間件添加到 Gin Engine 實例中:

      func Default() *Engine {
      	debugPrintWARNINGDefault()
      	engine := New()
      	engine.Use(Logger(), Recovery())
      	return engine
      }
      
  3. GIn除了**gin.Default()**還有什麼router engine可以設置?

    1. 除了**gin.Default(),Gin還提供了另一個方法來建立router,那就是gin.New()。使用gin.New()**創建的router不包括任何middleware,它是一個naked middleware。

      func New() *Engine {
      	debugPrintWARNINGNew()
      	engine := &Engine{
      		RouterGroup: RouterGroup{
      			Handlers: nil,
      			basePath: "/",
      			root:     true,
      		},
      		...
      	}
      	return engine
      }
      
    2. 這意味著,當您想要完全自定義middleware時,可以使用**gin.New()**,然後根據需要手動添加middleware

      goCopy code
      router := gin.New()
      router.Use(gin.Logger())          // 添加日誌中間件
      router.Use(gin.Recovery())       // 添加恢復中間件
      
      
    3. 使用**gin.New()提供了更大的靈活性,允許您根據需求選擇和配置中間件。但如果您想要一個快速設置且帶有常用中間件的路由器,則gin.Default()**是一個很好的選擇。


上一篇
[Day 17] Setup a workflow for Golang and Postgres in Github Action
下一篇
[Day 19] Implement RESTful in GO using Gin Part 2
系列文
Techschool Goalng Backend Master Class 的學習記錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言