banner

Gin开发RESTful应用(二)

分类: Go |发布时间: 11/2/2018, |修改时间: 11/4/2018, |共有 0 条评论 点此返回

在应用中我们不可避免的使用Form格式提交表单, 本文提供了一种处理Form表单的方法。

假设我们需要提交username和passsword以供登陆。

使用form.add方法增加

我们依然遵循TDD,编写一个测试方法, 这个测试方法的目标是将用户输入的用户名和密码提交到后台

func TestAuth(t *testing.T) {
    form := url.Values{}
    form.Add("username", "tokei")
    form.Add("password", "password")
    // 使用strings.NewReader
    req, _ := http.NewRequest("POST", "/login", strings.NewReader(form.Encode()))
    // 添加头部
    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    response := executeRequest(req)
    fmt.Println(response.Body)
}

需要在请求头部添加请求类型, 主要有

  • application/x-www-form-urlencoded 在发送前编码所有字符(默认)
  • multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值
  • text/plain 空格转换为 "+" 加号,但不对特殊字符编码。

使用multipart包

更复杂的情况是处理文件上传。这时需要用到multipart包

func TestUploadFile(t *testing.T) {
    filename := "DqCKyZUVYAEDHxN.jpg"
    bodyBuf := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuf)
    _ = bodyWriter.WriteField("name", "tokei")
    _ = bodyWriter.WriteField("email", "460512944@qq.com")
    //关键的一步操作
    fileWriter, err := bodyWriter.CreateFormFile("files", filename)
    if err != nil {
        fmt.Println("error writing to buffer")
    }
    //打开文件句柄操作
    fh, err := os.Open(filename)
    if err != nil {
        fmt.Println("error opening file")
    }
    defer fh.Close()
    //iocopy
    _, err = io.Copy(fileWriter, fh)
    contentType := bodyWriter.FormDataContentType()
    bodyWriter.Close()
    req, _ := http.NewRequest("POST", "/upload", bodyBuf)
    //req.Header.Add("Content-Type", "multipart/form-data")
    req.Header.Add("Content-Type", contentType)
    response := executeRequest(req)
    fmt.Println(response.Body)
}

参考文献

0 条评论

评论排序
banner

Tokei

Entertainment & Technical Blog

Bilibili |  Github