一、Request请求结构
①Request结构几个重要参数
Form:存储了post、put和get参数,在使用之前需要调用ParseForm方法。
PostForm:存储了post、put参数,在使用之前需要调用ParseForm方法。
MultipartForm:存储了包含了文件上传的表单的post参数,在使用前需要调用ParseMultipartForm方法。
二、获取参数
①获取get参数
r.ParseForm() if len(r.Form["id"]) > 0 { fmt.Fprintln(w, r.Form["id"][0]) }
其中r表示*http.Request类型,w表示http.ResponseWriter类型。
r.Form是url.Values字典类型,r.Form[“id”]取到的是一个数组类型。因为http.request在解析参数的时候会将同名的参数都放进同一个数组里,所以这里要用[0]获取到第一个。
这种取法在通常情况下都没有问题,但是如果是如下请求则无法取到需要的值:
<form action="http://localhost:9090/?id=1" method="POST"> <input type="text" name="id" value="2" /> <input type="submit" value="submit" /> </form>
因为r.Form包含了get和post参数,并且以post参数为先,上例post参数和get参数都有id,所以应当会取到post参数2。虽然这种情况并不多见,但是从严谨的角度来看程序上还是应当处理这种情况。立马补上改进代码:
queryForm, err := url.ParseQuery(r.URL.RawQuery) if err == nil && len(queryForm["id"]) > 0 { fmt.Fprintln(w, queryForm["id"][0]) }
代码比较简单,就是分析url问号后的参数。事实上这个也是标准库ParseForm中关于get参数解析代码。
②获取post参数
分两种情况
(1)普通的post表单请求,Content-Type=application/x-www-form-urlencoded
获取参数可用如下代码:
fmt.Fprintln(w, r.PostFormValue("id"))
(2)有文件上传的表单,Content-Type=multipart/form-data
<form action="http://localhost:9090" method="POST" enctype="multipart/form-data"> <input type="text" name="id" value="2" /> <input type="file" name="pic" /> <input type="submit" value="submit" /> </form>
因为需要上传文件,所以表单enctype要设置成multipart/form-data。此时无法通过PostFormValue来获取id的值。
可以通过获取如下代码获取 :
r.ParseMultipartForm(32 << 20) if r.MultipartForm != nil { values := r.MultipartForm.Value["id"] if len(values) > 0 { fmt.Fprintln(w, values[0]) } }
③获取cookie参数
cookie, err := r.Cookie("id") if err == nil { fmt.Fprintln(w, "Domain:", cookie.Domain) fmt.Fprintln(w, "Expires:", cookie.Expires) fmt.Fprintln(w, "Name:", cookie.Name) fmt.Fprintln(w, "Value:", cookie.Value) }
r.Cookie返回*http.Cookie类型,可以获取到domain、过期时间、值等数据。