在 Golang 中读取请求正文两次

type ValidationModel struct {

    Name     string `json:"name" valid:"alpha,required~Name is required"`

    Email    string `json:"email" valid:"email~Enter a valid email.,required~Email is required."`

    Password string `json:"password" valid:"required~Password is required"`

}


validationModel := ValidationModel{}


json.NewDecoder(r.Body).Decode(&validationModel)


_, err := govalidator.ValidateStruct(validationModel)

首先,我使用 govalidator 验证请求正文。


type UserModel struct {

    ID           bson.ObjectId `json:"_id" bson:"_id"`

    Name         string        `json:"name" bson:"name"`

    Email        string        `json:"email" bson:"email"`

    Password     string        `json:"password,omitempty" bson:"-"`

    PasswordHash string        `json:"-" bson:"passwordHash"`

    Salt         string        `json:"-" bson:"salt"`

    Token        string        `json:"token,omitempty" bson:"-"`

}



user := models.UserModel{}

json.NewDecoder(r.Body).Decode(&user)


fmt.Println(user)

在验证请求之后,我再次将请求主体解码为用户结构,但请求主体已使用 validationModel 读取一次,因此当我再次尝试将其解码为用户时,它没有给我任何值。

我可以在这里想到两种解决方案:

  1. 将请求主体存储在一个单独的变量中,并使用该变量两次。

  2. 复制用户中的 validationModel 值。

但是我对实施这些方法以及最好遵循哪种方法一无所知。或者有没有其他可以实施的解决方案?

提前致谢。


子衿沉夜
浏览 92回答 1
1回答

缥缈止盈

使用ioutil.ReadAll()可以轻松地存储数据:data, err := ioutil.ReadAll(r.Body)如果您需要将data背面作为 a io.Reader(就是这样r.Body),那么您可以使用bytes.NewReader():reader := bytes.NewReader(data)实际上,r.Body是一个io.ReadCloser,因此如果您需要,可以将ioutil.NopCloser()与bytes.NewReader()结合使用:reader := ioutil.NopCloser(bytes.NewReader(data))
打开App,查看更多内容
随时随地看视频慕课网APP