Go与HTML表单

POST和GET请求都可以传递表单,但一般由POST请求传递表单。以GET方法传递表单时,表单数据以键值的形式包含在请求的URL里。服务器在接收到浏览器发送的数据表单之后 ,还需要对这些数据进行语法分析,从而提取数据中的记录的键值对。
HTML表单的内容类型(content type)决定了POST请求在发送键值对将使用何种格式,HTML表单的内容类型是由表单的enctype属性指定的:

application/x-www-form-urlencoded  //用于简单文本传输,编码简单高效,计算量少
multipart/form-data  //传输大量数据(如上传文件),还可以通过Base64编码,传输二进制数据
text/plain

不接受application/json编码
Form字段:
支持url编码,键值的来源是url和表单。
PostForm字段:
支持url编码,键值的来源是表单。如果一个键同时拥有表单键值和url键值,用户只想获取表单键值,可使用该字段。

func process(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()  //语法分析
    fmt.Fprintln(w, "表单键值对和URL键值对:", r.Form)
    fmt.Fprintln(w, "表单键值对:", r.PostForm)
}

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>Form字段练习</title>
</head>
<body>
<form action="http://127.0.0.1:8080/process?name=go&color=red" method="post" enctype="application/x-www-form-urlencoded">
    <input type="text" name="name" value="mc"/>
    <input type="text" name="color" value="red"/>
    <input type="submit"/>
</form>
</body>
</html>

MultipartForm字段:
支持mutipart/form-data编码,键值来源是表单。

func dataProcess(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(1024)  //从表单里提取多少字节的数据
    fmt.Fprintln(w, r.MultipartForm)  //multipartform是包含2个映射的结构
}

快捷方法:
FormValue:自动调取ParseForm或ParseMultpartForm方法,获取键值对。
PostFormValue:类似FormValue,只支持获取表单键值。
上传文件:
multpart/form-data编码通常用于实现文件上传,需要file类型的input标签。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>upload</title>
</head>
<body>
<form action="http://localhost:8080/file" method="post" enctype="multipart/form-data">
    <input type="file" name="uploaded">
    <input type="submit">
</form>
</body>
</html>

上传:

func fprocess(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(4096)  
    fileHeader := r.MultipartForm.File["uploaded"][0]  //获取名为"uploaded"的第一个文件头

    file, err := fileHeader.Open()  //获取文件
    if err != nil {
        fmt.Println("error")
        return
    }

    data, err := ioutil.ReadAll(file)  //读取文件
    if err != nil {
        fmt.Println("error!")
        return
    }
    fmt.Fprintln(w, string(data))
}

快捷方法:
FormFile方法同时返回文件和文件头,包含了语法分析,只获取文件名的第一个文件。

猜你喜欢

转载自blog.csdn.net/weixin_42506905/article/details/82502102