跳转到内容

上下文

Fox 处理器使用 *fox.Context。它包装并嵌入了 Gin 的 *gin.Context,因此可以直接使用 QueryParamJSONAbortGetHeader 等 Gin 方法;同时 Fox 增加了请求体缓存、TraceID、日志访问和 context.Context 兼容能力。

Fox 处理器可以选择性地接受 *fox.Context 参数:

r.GET("/path", func(c *fox.Context) (any, error) {
// 访问 context
return response, nil
})

Gin 中间件仍然使用 *gin.Context

func MyMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Set("user_id", 123)
c.Next()
}
}
name := c.Query("name") // 获取查询参数
page := c.DefaultQuery("page", "1") // 带默认值
r.GET("/user/:id", func(c *gin.Context) {
id := c.Param("id")
})
token := c.GetHeader("Authorization")
userAgent := c.Request.UserAgent()
var data map[string]any
c.ShouldBindJSON(&data)

Fox 还提供 RequestBody(),用于读取并缓存原始请求体。它会恢复 body,后续绑定仍然可以再次读取:

body, err := c.RequestBody()
ip := c.ClientIP()
c.JSON(200, gin.H{
"message": "success",
})
c.String(200, "Hello, World!")
c.HTML(200, "index.html", gin.H{
"title": "主页",
})
c.Redirect(302, "/new-path")
c.Status(204) // No Content
c.Set("user_id", 123)
userID := c.GetInt("user_id")
value, exists := c.Get("key")
userID := c.MustGet("user_id").(int)
file, _ := c.FormFile("file")
c.SaveUploadedFile(file, "./uploads/"+file.Filename)
form, _ := c.MultipartForm()
files := form.File["files"]
for _, file := range files {
c.SaveUploadedFile(file, "./uploads/"+file.Filename)
}
c.File("./assets/image.png")
c.SetCookie(
"session_id", // name
"abc123", // value
3600, // maxAge (seconds)
"/", // path
"example.com", // domain
false, // secure
true, // httpOnly
)
value, err := c.Cookie("session_id")

停止处理并返回:

if !isAuthenticated(c) {
c.JSON(401, gin.H{"error": "未授权"})
c.Abort()
return
}
c.Logger.Info("处理请求")
traceID := c.TraceID()

*fox.Context 通过 c.Request.Context() 实现标准 context 方法:

select {
case <-c.Done():
return nil, c.Err()
default:
}
value := c.Value(myKey)