Golang 将 form-urlencoded 序列化为对象

Posted

技术标签:

【中文标题】Golang 将 form-urlencoded 序列化为对象【英文标题】:Golang serialize form-urlencoded to object 【发布时间】:2022-01-15 12:19:57 【问题描述】:

我发出了一个发布请求,我将数据作为 JSON 发送,这段代码在数据库中创建了一个新行。

json.NewDecoder(r.Body).Decode(&user)
DB.Create(&user)
json.NewEncoder(w).Encode(user)

但是解析表单数据显示这个错误 我想这就是我读取每个单独值的方式

for key, value := range r.PostForm 
        fmt.Printf("Key:%s, Value:%s\n", key, value)

我的模型是这样的

type User struct 
    gorm.Model
    FirstName string `json:"firstname"`
    LastName  string `json:"lastname"`
    Email     string `json:"email"`

如何将其转换为用户并插入数据库?

【问题讨论】:

json.NewDecoder(r.Body).Decode(&user)
application/x-www-form-urlencoded
u.FirstName = r.FormValue("firstname")
需要解析一个 URL 编码的表单给用户 ***.com/questions/44052311/… 【参考方案1】:
r.FormValuer.FormValue("firstname")
func handleUser(w http.ResponseWriter, r *http.Request) 
    user := User
    userType := reflect.TypeOf(user)
    for i := 0; i < userType.NumField(); i++ 
        // Get the JSON tag of the field, use it for the r.FormValue
        f := userType.Field(i).Tag.Get("json")
        if f != "" 
            reflect.ValueOf(&user).Elem().FieldByName(
                userType.Field(i).Name).SetString(r.FormValue(f))
        
    
    // DB.Create(&user) need a reference to DB here.
    json.NewEncoder(w).Encode(user)

SetStringFieldByName(...

正如 Cerise Limón 指出的那样,正确的做法是

func handleUser(w http.ResponseWriter, r *http.Request) 
    user := User
    user.FirstName = r.FormValue("firstname")
    user.LastName = r.FormValue("lastname")
    user.Email = r.FormValue("email")
    // DB.Create(&user) need a reference to DB here.
    json.NewEncoder(w).Encode(user)

请注意,如果您在多个地方执行此操作,您还可以添加一个使用表单填充用户的方法,例如

func (u *User) setFormData(r *http.Request) 
    u.FirstName = r.FormValue("firstname")
    u.LastName = r.FormValue("lastname")
    u.Email = r.FormValue("email")

然后像这样使用它

func handleUser(w http.ResponseWriter, r *http.Request) 
    user := User
    user.setFormData(r)
    // DB.Create(&user)
    json.NewEncoder(w).Encode(user)

【讨论】:

以上是关于Golang 将 form-urlencoded 序列化为对象的主要内容,如果未能解决你的问题,请参考以下文章