8668bce3da96c1ebbe1b441cc6fc5565
Gin(四):表单提交校验和模型绑定

上一个章节中已经开始逐渐搭建了一个 Web 页面,现在我们开始逐步完善页面上的功能,首先要完成的是登录和注册功能。

🎯接受表单数据

注册页面的 HTML 元素不在详细写出,具体页面代码可以直接参考 Github 上代码。

页面完成后布局:

注册页面有三个输入框,分别为 email ,passwordpassword again

完善后端 Gin 代码。我们在 initRouteruserGroup 中编写新的接口。

userRouter.POST("/register", handler.UserRegister)

编写完新的接口就要开始编写 Handler

func UserRegister(context *gin.Context) {
    email := context.PostForm("email")
    password := context.DefaultPostForm("password", "Wa123456")
    passwordAgain := context.DefaultPostForm("password-again", "Wa123456")
    println("email", email, "password", password, "password again", passwordAgain)
}

UserRegister 方法中采用新的方式来接受 Post 请求提交的表单参数,PostFormDefaultPostFormPostForm 直接接受参数,而 DefaultPostForm 可以设置一个默认值,如果前端没有进行传值,那么我们可以设置默认值,如上面的代码,如果前端没有将密码传输过来我们可以设置一个默认密码。

当我们运行并且输入的时候,在控制台上可以清楚的看到我们在表单上的输入。

当我们项目功能完善的时候,就可以完善我们的单元测试。

此时的单元测试交之前有点复杂。

首先我们要构造一个结构,该结构是为了帮助我们将我们要提交的信息存放到表单中,同时要指定请求头信息。

func TestUserPostForm(t *testing.T) {
    value := url.Values{}
    value.Add("email", "youngxhui@gmail.com")
    value.Add("password", "1234")
    value.Add("password-again", "1234")
    w := httptest.NewRecorder()
    req, _ := http.NewRequest(http.MethodPost, "/user/register", bytes.NewBufferString(value.Encode()))
    req.Header.Add("Content-Type", "application/x-www-form-urlencoded; param=value")
    router.ServeHTTP(w, req)
    assert.Equal(t, http.StatusOK, w.Code)
}

单元测试编写完成后可以运行单元测试,发现控制台答应了我们在测试中写的数据。

🧣模型绑定

上例中我们的表单仅仅传输了三个参数,如果后期项目出现了十多个参数,每次写一遍都很花费时间,也很消耗经历。下面就对该方法进行改善

Gin 中提供了 模型绑定,将我们的表单数据与我们的模型进行一样绑定。Gin会将数据统一封装到模型中,方便我们日后使用。

首先定义我们的模型,新建 model 文件夹,建立 userModel.go

package model

type UserModel struct {
    Email         string `form:"email"`
    Password      string `form:"password"`
    PasswordAgain string `form:"password-again"`
}

通过 form:"email" 来对表单中的 email 输入数据进行绑定。然后需要修改一下 Handler 方法。

```go
func UserRegister(context *gin.Context) {
var user model.UserModel
if err := context.ShouldBind(&user); err != nil {
println("err ->", err.Error())

top Created with Sketch.