package main
import (
"fmt"
"net/http"
)
/*
表单post请求的数据格式
通过POST发送的name-value数据对的格式可以通过表单的Contest Type指定
即enctype属性:默认值为 application/x-www-form-urlencoded
<form action="/process" method="post" enctype="application/x-www-form-urlencoded">
<input type="text" name="first_name"/>
<input type="text" name="last_name"/>
<input type="submit"/>
</form>
如果 enctype = application/x-www-form-urlencoded ,则:
浏览器会将表单数据编码到查询字符串里,例如:
first_name=jian&last_name=shi
如果 enctype = multipart/form-data ,则:
每一个name=value对都会被转换为一个MIME消息部分
每一个部分都有自己的Content Type 和 Content Disopsioton
如何选择两种格式?
1.简单文本:application/x-www-form-urlencoded
2.大量数据,例如上传文件:multipart/form-data
*/
/*
Form 字段
Request上的函数允许我们从URL或者Body中提取数据,
Form
PostForm
MultipartForm
Form里面的数据是key-value对
通常做法是:
先调用ParseForm或ParaseMultipartForm来解析Request
然后访问Form PostForm MultipartForm字段
如果只想得到first_name这个key的Value,可使用r.Form["first_name"],返回包含一个元素的slice
如果表单和URL里有同样的key,那么透明将会存放再同一个slice里,表单值靠前,url值靠后。
如果只想要表单的key,不要URL的,可以使用PostForm
*/
/*
PostForm 字段
如果只想要表单的key,不要URL的,可以使用PostForm
但是 Form 和 PostForm 均不支持 表单post请求的数据格式enctype = multipart/form-data,
支持 enctype = application/x-www-form-urlencoded
而MultipartForm支持 enctype = multipart/form-data
*/
/*
MultipartForm 字段
要想使用MultipartForm,首先需要调用ParseMultipartForm()方法
该方法会在必要时调用ParseForm(),参数是需要读取的数据的长度
MultipartForm只包含表单的key-value对
返回类型是一个struct而不是map,这个struct里有两个map
key string value []string
key string value 文件 (本例为空)
*/
//--------------------------------------------------------------//
/*
FormValue方法会返回Form字段指定key对应的第一个value,无需再调用ParaseForm
PostFormValue同样,但二者似乎受enctype类型影响??
*/
func multipartForm() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
http.HandleFunc("/process", func(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(1024)
fmt.Fprintln(w, r.MultipartForm)
})
server.ListenAndServe()
}
func form() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
http.HandleFunc("/process", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
fmt.Fprintln(w, r.Form)
})
server.ListenAndServe()
}
func postform() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
http.HandleFunc("/process", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
fmt.Fprintln(w, r.PostForm)
})
server.ListenAndServe()
}
func main() {
//form()
//postform()
multipartForm()
}
form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form</title>
</head>
<body>
<form action="http://localhost:8080/process" method="post" enctype=application/x-www-form-urlencoded">
<input type="text" name="first_name"/>
<input type="text" name="last_name"/>
<input type="submit"/>
</form>
</body>
</html>
postform.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form</title>
</head>
<body>
<form action="http://localhost:8080/process?first_name=xiao&last_name=ming" method="post" enctype=application/x-www-form-urlencoded">
<input type="text" name="first_name"/>
<input type="text" name="last_name"/>
<input type="submit"/>
</form>
</body>
</html>
MultipartForm.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form</title>
</head>
<body>
<form action="http://localhost:8080/process?first_name=xiao&last_name=ming" method="post" enctype="multipart/form-data">
<input type="text" name="first_name"/>
<input type="text" name="last_name"/>
<input type="submit"/>
</form>
</body>
</html>