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)
在验证了请求之后,我再次将请求主体解码为用户struct,但已使用validationModel读取了请求主体一次,因此当我尝试再次将其解码为用户时,它没有给我任何值。
我在这里可以想到两种解决方案:
将请求正文存储在一个单独的变量中,并使用该变量两次。
在用户中复制validationModel值。
但是我对实现这些方法一无所知,最好采用哪种方法。还是可以实施其他解决方案?
谢谢。
答案 0 :(得分:5)
使用ioutil.ReadAll()可以轻松完成数据存储:
data, err := ioutil.ReadAll(r.Body)
如果您需要将data
作为io.Reader
(这就是r.Body
的形式),则可以使用bytes.NewReader():
reader := bytes.NewReader(data)
实际上,r.Body
是io.ReadCloser
,因此如果需要,您可以将ioutil.NopCloser()与bytes.NewReader()结合使用:
reader := ioutil.NopCloser(bytes.NewReader(data))