1. 程式人生 > >基於gin的golang web開發:Gin技術拾遺

基於gin的golang web開發:Gin技術拾遺

本文是對前幾篇文章的一些補充,主要包含兩部分:單元測試和實際專案中使用路由的小問題。 ### 拾遺1:單元測試 Golang單元測試要求程式碼檔案以```_test```結尾,單元測試方法以```Test```開頭,引數為*testing.T型別。以下是一個計算hash值的工具包和對應的單元測試。 hashUtils.go ```golang package utils import ( "crypto/md5" "crypto/sha1" "fmt" ) func Md5(str string) string { data := []byte(str) has := md5.Sum(data) return fmt.Sprintf("%X", has) } func SHA1(data []byte) []byte { h := sha1.New() h.Write(data) return h.Sum(nil) } ``` hashUtils_test.go ```golang package utils import ( "fmt" "testing" ) func TestMd5(t *testing.T) { content := "123456" md5 := Md5(content) if "E10ADC3949BA59ABBE56E057F20F883E" != md5 { t.Errorf("md5 failed") } } func TestSHA1(t *testing.T) { content := "123456" sha1 := fmt.Sprintf("%x", SHA1([]byte(content))) if "7c4a8d09ca3762af61e59520943dc26494f8941b" != sha1 { t.Errorf("sha1 failed") } } ``` 除了測試這種邏輯程式碼我們還需要測試HTTP的請求響應。Gin推薦使用```net/http/httptest```測試HTTP相關的程式碼。 啟動一個Gin伺服器main.go ``` package main func setupRouter() *gin.Engine { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func main() { r := setupRouter() r.Run(":8080") } ``` 單元測試main_test.go ``` package main import ( "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestPingRoute(t *testing.T) { router := setupRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/ping", nil) router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) assert.Equal(t, "pong", w.Body.String()) } ``` ### 拾遺2:路由 先看程式碼 ``` userRouter := router.Group(`users`) { userRouter.GET(`/`, userHandler.UserList) } ``` 我們聲明瞭路由```/users/```,這是一個Web Api,傳入引數的url大概是這樣的```/users/?pageIndex=1&pageSize=10```。使用者訪問```/users?pageIndex=1&pageSize=10```時也能正常返回資料,這是因為Gin幫我們做了一次301跳轉,問題就出在這裡。我們的路由是Web Api使用者可能是JS前端,也可能是其他的業務系統。如果使用者不支援301跳轉呢? 其實我們只要在增加一個空路徑路由就可以解決問題。 ```golang userRouter := router.Group(`users`) { userRouter.GET(``, userHandler.UserList) userRouter.GET(`/`, userHandler.UserList) } ``` 現在不管使用者訪問```/users/?pageIndex=1&pageSize=10```還是訪問```/users?pageIndex=1&pageSize=10```都會得到正確的結果。 文章出處:[基於gin的golang web開發:Gin技術拾遺][source] [source]: https://www.huaface.com/arti