登录
首页 >  Golang >  Go问答

读取 Golang 中请求正文两次

来源:stackoverflow

时间:2024-02-28 18:45:25 116浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《读取 Golang 中请求正文两次》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过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值。

但我不知道如何实施这些方法以及最好遵循哪种方法。或者还有其他可以实施的解决方案吗?

提前致谢。


解决方案


使用 ioutil.ReadAll() 可以轻松存储数据:

data, err := ioutil.readall(r.body)

如果您需要将 data 作为 io.reader (这就是 r.body 的方式),那么您可以使用 bytes.NewReader()

reader := bytes.newreader(data)

实际上,r.bodyio.readcloser,因此如果您需要,可以将 ioutil.NopCloser()bytes.NewReader() 结合使用:

reader := ioutil.NopCloser(bytes.NewReader(data))

本篇关于《读取 Golang 中请求正文两次》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>