开发者

go将request body绑定到不同的结构体中教程

开发者 https://www.devze.com 2023-11-21 12:28 出处:网络 作者: Go
目录c.Request.Body 方法绑定数据多次绑定c.Request.Body 方法绑定数据 一般通过调用 c.Request.Body 方法绑定数据,但不能多次调用这个方法。
目录
  • c.Request.Body 方法绑定数据
  • 多次绑定

c.Request.Body 方法绑定数据

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

type formA struct {
  Foo string `json:"foo" XML:"foo" binding:"required"`
}
type formB struct {
  Bar string `json:"bar" xml:"bar" binding:"required"`
}
func SomeHandler(c *gin.Context) {
  objA := formA{}
  objB := formB{}
  // c.ShouldBind 使用了 c.Request.Body,不可重用。
  if errA := c.ShouldBind(&objA); errA == nil {
    c.String(h编程客栈ttp.StatusOK, `the body should be formA`)
  // 因为现在 c.Request.Body 是 EOF,所以这里会报错。
  } else if errB := c.ShouldBind(&objB); errB == nil {
    c.String(http.StatusOK, `the body should be formB`)
  } else {
    ...
  }
}

多次绑定

可以使用 c.ShouldBindBodyWith.

func SomeHandler(c *gin.Context) {
  objA := formA{}
  objB := formB{}
  // 读取 c.Request.Body 并将结果存入上下文。
  pythonif errA := c.ShboWyoVAEZeouldBindBodyWith(&objA, binding.JSON); errA == nil javascript{
    c.String(http.StatusOK, `the body should be formA`)
  // 这时, 复用存储在上下文中的 body。
  } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil {
    c.String(http.StatusOK, `the body should be formB JSON`)
  // 可以接受其他格式
  } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil {
    c.String(http.StatusOK, `the body should be formB XML`)
  } else {
    ...
  }
}

c.ShouldBindBodyWith 会在绑定之前将 body 存储到上下文中。 这会对性能造成轻微影响,如果调用一次就能完成绑定的话,php那就不要用这个方法。

只有某些格式需要此功能,如 JSON, XML, MsgPack, ProtoBuf。

对于其他格式,如 Query, Form, FormPost, FormMultipart 可以多次调用 c.ShouldBind() 而不会造成任任何性能损失,详见

以上就是go将request body绑定到不同的结构体中教程的详细内容,更多关于go request body绑定结构体的资料请关注编程客栈(www.devze.com)其它相关文章!

0

精彩评论

暂无评论...
验证码 换一张
取 消