梗概:
*gin.Context
是處理HTTP請求的核心。ctx
代表"context"(上下文),它包含了處理請求所需的所有信息和方法,例如請求數據、響應構建器、路由參數等。
基本的格式:
func SomeHandler(ctx *gin.Context) {// 使用ctx來處理請求和構建響應
}
常見的使用:
1. 讀取查詢參數
從請求中讀取查詢字符串參數。
func ReadQueryParams(ctx *gin.Context) {value := ctx.Query("someParam") // 獲取查詢參數ctx.JSON(http.StatusOK, gin.H{"someParam": value, // 回顯參數})
}
2. 讀取POST表單數據
對于POST請求中發送的表單數據的訪問
func ReadPostForm(ctx *gin.Context) {value := ctx.PostForm("somePostParam") // 獲取POST表單參數ctx.JSON(http.StatusOK, gin.H{"somePostParam": value,})
}
3. 讀取JSON請求體
如果請求有JSON體,將其綁定到一個結構體。
type RequestBody struct {Message string `json:"message"`
}func ReadJSONBody(ctx *gin.Context) {var body RequestBodyif err := ctx.BindJSON(&body); err != nil {ctx.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON"}) // 綁定JSON失敗return}ctx.JSON(http.StatusOK, gin.H{"message": body.Message,})
}
4. 寫入JSON響應
向客戶端寫入JSON響應。
func WriteJSONResponse(ctx *gin.Context) {ctx.JSON(http.StatusOK, gin.H{"status": "success","data": "some data",})
}
5. 流式響應
對于大型響應,您可以向客戶端流式傳輸數據。
func StreamResponse(ctx *gin.Context) {for i := 0; i < 10; i++ {ctx.SSEvent("message", gin.H{"data": "Streaming " + strconv.Itoa(i)})time.Sleep(1 * time.Second)}
}
6. 訪問路由參數
可以使用Param
方法訪問路由參數。
func RouteParameter(ctx *gin.Context) {productID := ctx.Param("id") // 獲取路由參數ctx.JSON(http.StatusOK, gin.H{"product_id": productID,})
}
7. 設置Cookies
您可以設置和獲取cookies。
func CookieExample(ctx *gin.Context) {ctx.SetCookie("username", "user1", 3600, "/", "localhost", false, true) // 設置cookieusername := ctx.GetCookie("username") // 獲取cookiectx.JSON(http.StatusOK, gin.H{"cookie_username": username,})
}
8. 錯誤處理
您可以處理錯誤并返回適當的響應。
func ErrorHandling(ctx *gin.Context) {if someCondition {ctx.JSON(http.StatusBadRequest, gin.H{"error": "Bad request"}) // 發送錯誤響應} else {ctx.JSON(http.StatusOK, gin.H{"message": "Success"}) // 發送成功響應}
}
9. 文件上傳
也支持處理文件上傳。
func FileUpload(ctx *gin.Context) {file, err := ctx.FormFile("file") // 獲取上傳的文件if err != nil {ctx.JSON(http.StatusBadRequest, gin.H{"error": "Error uploading file"}) // 文件上傳失敗return}ctx.SaveUploadedFile(file, "path/to/save/"+file.Filename) // 保存文件ctx.JSON(http.StatusOK, gin.H{"message": "File uploaded successfully"}) // 文件上傳成功
}
10. 使用中間件
*gin.Context
經常在中間件中使用,以執行請求處理前后的動作。
func MyMiddleware(c *gin.Context) {c.Set("myKey", "myValue") // 在中間件中設置值c.Next() // 調用下一個中間件或處理器
}func main() {router := gin.Default()router.Use(MyMiddleware) // 使用自定義中間件router.GET("/somepath", func(c *gin.Context) {value := c.Get("myKey") // 從中間件獲取值c.JSON(http.StatusOK, gin.H{"myKey": value})})router.Run()
}