希曼日记

参数绑定

本页目录 5
  1. GET
  2. Body
  3. Param
  4. 动态参数
  5. form-data/x-www-form-urlencode

GET

Query

//查询请求URL后面的参数

Body

  • 使用ShouldBindJSON
  • 适用于POST/PUT/PATCH
type Person struct {
	Name       string      `json:"username" binding:"required,min=3,max=20"`
	Nickname   string      `json:"nickname" binding:"nefield=Name"`
	Age        json.Number `json:"age"`
	CreateTime time.Time   `json:"create_time" `
	Password   string      `json:"password" binding:"required,min=3"`
	RePassword string      `json:"re_password" binding:"required,eqfield=Password"`
	Tel        string      `json:"tel"`
}

userGroup := server.Group("/")
	{
		userGroup.POST("/add", func(context *gin.Context) {

			bindError := context.ShouldBindJSON(&join)
			if bindError != nil {
				context.JSON(http.StatusBadRequest, gin.H{
					"msg": bindError.Error(),
				})
				return
			}
			context.JSON(http.StatusOK, gin.H{
				"person": join,
			})
		})
	}

Param

参数

  • 使用ShouldBindQuery, 参数绑定需要使用form这个tag, 与Body体的json不同
  • 适用于POST/GET/PUT/PATCH
type Person struct {
	Name   string      `json:"name" form:"name"`
	Age    json.Number `json:"age" form:"age"`
	Gender string      `json:"gender" form:"gender"`
}

userGroup.POST("/", func(context *gin.Context) {
	err := context.ShouldBindQuery(&join)
	if err != nil {
	context.JSON(http.StatusBadRequest, gin.H{
		"msg": err.Error(),
		})
		return
	}
	context.JSON(http.StatusOK, gin.H{
	"Person": join,
	})
})

动态参数

使用ShouldBindUri

type Person struct {
	Name string `json:"name" form:"name" uri:"name"`
}

userGroup.GET("/:name/profile", func(context *gin.Context) {

			err := context.ShouldBindUri(&join)
			if err != nil {
				context.JSON(http.StatusBadRequest, gin.H{
					"msg": err.Error(),
				})
				return
			}
			context.JSON(http.StatusOK, gin.H{
				"name": join,
			})

		})

form-data/x-www-form-urlencode

前端发送form请求

const submit = () => {
	const userInfo: FormData = new FormData()
	userInfo.append('account', "account")
	userInfo.append('password', "password")
	userInfo.append('avatar', "avatar")
	userInfo.append('email', "email")
	userInfo.append('nickname', "nickname")
	userInfo.append('gender', "gender")
	userInfo.append('createdAt', "new Date().getTime().toString()")
	userInfo.append('updatedAt', "new Date().getTime().toString()")
	fetch('http://localhost:4000/register', {
		method: 'PUT',
		body: userInfo,
	})
	.then((res) => {
		if (res.ok){
			return res.json()
		}
		throw new Error('请求失败')
	})
	.then((res) => {
		console.log(res)
	})
	.catch((err) => {
		console.error(err)
	})
}

使用ShoulBind tagform

package http

import (
	"context"
	"github.com/gin-gonic/gin"
	"im/db"
	"im/schema"
	"log"
	"net/http"
)

type UserBasic struct {
	Account   string `form:"account" json:"account"`
	Password  string `form:"password" json:"password"`
	Avatar    string `form:"avatar" json:"avatar"`
	Email     string `form:"email" json:"email"`
	Nickname  string `form:"nickname" json:"nickname"`
	Gender    string `form:"gender" json:"gender"`
	CreatedAt string `form:"createdAt" json:"createdAt"`
	UpdatedAt string `form:"updatedAt" json:"updatedAt"`
}

func Register(c *gin.Context) {
	var userInfo UserBasic
	if err := c.ShouldBind(&userInfo); err != nil {
		log.Println("转换JSON失败")
		return
	}
	
	result, err := db.Mongo.
		Database("im").
		Collection(schema.UserBasic{}.Collection()).
		InsertOne(context.TODO(), userInfo)
	log.Println("result:", result)
	if err != nil {
		log.Println("插入数据失败" + err.Error())
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"data":    "OK",
		"message": "注册成功",
		"code":    http.StatusOK,
	})
}