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" }
json:"name" valid:"alpha,required~Name is required"
json:"email" valid:"email~Enter a valid email.,required~Email is required."
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读取了请求主体一次,因此当我尝试再次将其解码为用户时,它没有提供任何值。
我在这里可以想到两种解决方案:
将请求正文存储在一个单独的变量中,并使用该变量两次。
复制用户中的validationModel值。
但是我对实现这些方法一无所知,最好采用哪种方法。还是有其他可以实施的解决方案?
提前致谢。
可以使用ioutil.ReadAll()轻松地存储数据:
data, err := ioutil.ReadAll(r.Body)
如果需要data背面为io.Reader(这样r.Body),则可以使用bytes.NewReader():
data
io.Reader
r.Body
reader := bytes.NewReader(data)
r.Body实际上,是一个io.ReadCloser,因此,如果需要,可以将ioutil.NopCloser()与bytes.NewReader()结合使用:
io.ReadCloser
reader := ioutil.NopCloser(bytes.NewReader(data))