其他分享
首页 > 其他分享> > gin中间request body绑定到不同的结构体中

gin中间request body绑定到不同的结构体中

作者:互联网

1. 一般通过调用 c.Request.Body 方法绑定数据,但不能多次调用这个方法。

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

type FormA struct {
	Foo string `form:"foo" json:"foo" binding:"required"`
}
type FormB struct {
	Bar string `json:"bar" binding:"required"`
}
func someHandler(c *gin.Context) {
	// 一般通过c.request.body绑定数据,但是不能多次调用这个方法
	objA := FormA{}
	objB := FormB{}
	// c.ShouldBind 使用了 c.Request.Body 不可重用
	// 注意:ShouldBind方法,如果是GET请求,前台必须使用form-data传参
	if err := c.ShouldBind(&objA); err == nil {
		fmt.Println(objA.Foo)
		c.String(200, "the body should be FormA")
	// 因为现在 c.Request.Body 是EOF,所以这里会报错
	} else if err := c.ShouldBind(&objB); err == nil {
		c.String(200, "the body should be FormB")
	} else {
		fmt.Println(err)
		fmt.Println("未执行")
	}
}

func main() {
	router := gin.Default()
	router.POST("/ping", someHandler)
	router.Run()
}

  

2. 要想多次绑定,可以使用 c.ShouldBindBodyWith.

package main

import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)

type FormA struct {
Foo string `form:"foo" json:"foo" binding:"required"`
}
type FormB struct {
Bar string `json:"bar" binding:"required"`
}
func someHandler(c *gin.Context) {
objA := FormA{}
objB := FormB{}
// 读取 c.Request.Body 并将结果存入上下文。
if err := c.ShouldBindBodyWith(&objA, binding.JSON); err == nil {
fmt.Println(objA.Foo)
c.String(200, "the body should be FormA")
// 这时, 复用存储在上下文中的 body。
} else if err := c.ShouldBindBodyWith(&objB, binding.JSON); err == nil {
c.String(200, "the body should be FormB")
} else {
fmt.Println(err)
fmt.Println("未执行")
}
}

func main() {
router := gin.Default()
router.POST("/ping", someHandler)
router.Run()
}

  

标签:body,FormB,err,binding,fmt,request,体中,gin
来源: https://www.cnblogs.com/mayanan/p/15470332.html