Gin查詢參數和接收參數的方式
常用 Gin 綁定方法對比
方法 | 用途 | 特點 |
---|---|---|
c.Bind() | 自動識別 Content-Type | 最通用,根據請求頭自動選擇綁定方式 |
c.ShouldBindJSON() | 只綁定 JSON | 強制使用 JSON 格式,類型明確 |
c.ShouldBindXML() | 只綁定 XML | 強制使用 XML 格式 |
c.ShouldBindQuery() | 只綁定查詢參數 | 適用于 GET 請求的 URL 參數解析 |
c.ShouldBindUri() | 綁定 URI 參數 | 解析路徑參數(如 /user/:id ) |
c.ShouldBindForm() | 只綁定表單數據 | 專用于 form-data/x-www-form-urlencoded |
1、request body 綁定——ShouldBindJSON
// CreateUserRequest 創建用戶請求參數
type CreateUserRequest struct {Phone string `json:"phone" binding:"required"`Email string `json:"email" binding:"required,email"`Nickname string `json:"nickname"`RealName string `json:"realname"`Gender string `json:"gender" binding:"oneof=男 女"`Birth *time.Time `json:"birth"`
}func CreateUser(c *gin.Context) {// 定義接收參數的結構體var reqUser CreateUserRequest// 綁定并驗證請求body參數if err := c.ShouldBindJSON(&reqUser); err != nil {c.JSON(http.StatusBadRequest, gin.H{"status": "error","message123": "請求參數錯誤",})return}// 創建用戶實體user := repository.User{Phone: reqUser.Phone,Email: reqUser.Email,Nickname: reqUser.Nickname,RealName: reqUser.RealName,Gender: reqUser.Gender,// 其他字段...}// 保存到數據庫db := repository.GetDB()if err := db.Create(&user).Error; err != nil {c.JSON(http.StatusInternalServerError, gin.H{"status": "error","message": "創建用戶失敗: " + err.Error(),})return}// 返回成功響應c.JSON(http.StatusCreated, gin.H{"status": "success","message": "用戶創建成功","id": user.ID,})
2、路由參數
func main() {router := gin.Default()// 此 handler 將匹配 /user/john 但不會匹配 /user/ 或者 /userrouter.GET("/user/:name", func(c *gin.Context) {name := c.Param("name")c.String(http.StatusOK, "Hello %s", name)})// 此 handler 將匹配 /user/john/ 和 /user/john/send// 如果沒有其他路由匹配 /user/john,它將重定向到 /user/john/router.GET("/user/:name/*action", func(c *gin.Context) {name := c.Param("name")action := c.Param("action")message := name + " is " + actionc.String(http.StatusOK, message)})router.Run(":8080")
}
3、Query和post form
請求內容:
POST /post?id=1234&page=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
name=manu&message=this_is_great
接收:
func main() {router := gin.Default()router.POST("/post", func(c *gin.Context) {id := c.Query("id")page := c.DefaultQuery("page", "0")name := c.PostForm("name")message := c.PostForm("message")fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)})router.Run(":8080")
}
結果:
id: 1234; page: 1; name: manu; message: this_is_great