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方法同时返回文件和文件头,包含了语法分析,只获取文件名的第一个文件。