Request查询参数URL Query
URL Query
1. GET
上一节学习了GET请求获取, ,
2. POST
我们不用html提交POST请求,考虑用2个工具,第一个是Postman,第二个是Go的单元测试方法。
(1)Form(不仅能获取GET请求,也可以获取到POST请求内容,而POST请求优先GET)
调用ParseForm或者ParseMultipartForm解析Request
相应访问Form、PostForm或MultipartForm字段
实现函数源码
测试代码:
执行结果
解析源码:
27行:w.Header().Set(“Content-Type”, “application/json”),设置了响应的内容类型为Json。
29行://调用ParseForm或者ParseMultipartForm解析Request
32行:可以进行指定Key获取与给定键关联的第一个值。如果没有与键关联的值,Get返回空字符串。
37行到40行:将Form数据转换成json类型,通过for range将所有的值转成map。
44行:将map转成json格式
解析测试代码:
// 使用http.HandlerFunc声明一个handler,将测试函数PostData传入进去
handler := http.HandlerFunc(PostData)
// 用刚申明的handler启动测试服务器
server := httptest.NewServer(handler)
//启动服务器最后要关闭
defer server.Close()
// 显示URL地址
t.Log(server.URL)
// 定义URL传递的参数值,和Method无关,
//使用 url.Values进行定义,类型是 map[string][]string
values := url.Values{“id”: {“888”}, “name”: {“张无忌”}}
//将传递的参数值进行编码,
//例如id=123&name=zhangsnafeng,
//通过Encode()实现,返回值类型是string
e := values.Encode()
t.Log(e)
//这里启动1个POST请求,
//第一个参数是指定的URL,string类型
//第二个参数是发送的请求内容的类型, string类型。
//第三个是发送的主体。 io.Reader类型,因此需要strings.NewReader()将拼接的字符串进行转换
response, _ := http.Post(
server.URL+”/post”,
“application/x-www-form-urlencoded”,
strings.NewReader(e),
)
//通过ioutil.ReadAll读取body内容,返回值是字节集[]byte类型
bytes, _ := ioutil.ReadAll(response.Body)
t.Log(string(bytes))
(2)PostForm (不能获取GET请求,只能获取到POST请求内容)
使用Form的结果
可以看到Form不仅获取到了Get的请求信息,也获取到了Post的请求信息。
当我们仅需要Post请求信息怎么办呢?
执行结果
可以看到,只用修改1个位置就完成了这个功能。
代码详解同上面第一个详解大同小异:
60行: 采用PostForm方法获取表单内容
(3)MultipartForm
(3)FormValue与PostFormValue,用法相似
代码解析:
func FormValueData(w http.ResponseWriter, r *http.Request) {
_ = r.ParseForm()
//FormValue优先取POST的name的第一个值,如果POST没有name,name就取GET的Name。
name1 := r.FormValue(“name”)
//FormValue取POST、PATCH或PUT的name的第一个值。URL查询参数将被忽略。如果key不存在,PostFormValue返回空字符串。
name2 := r.PostFormValue(“name”)
data := map[string]interface{}{
“name1”:name1,
“name2”:name2,
}
bytes, _ := json.Marshal(data)
_, _ = w.Write(bytes)
}