获取请求
1.request结构体
在net/http中定义了request的结构体,里面包含了请求的信息。这里联想到为什么我们在写处理器函数的时候必须带上两个参数,因为我们需要拿到请求的信息,并且做出反应。
Request类型代表一个服务端接受到的或者客户端发送出去的HTTP请求
Method(方法):表示请求的方法-->有Get,Post,Put,Delete 在项目开发中有不同的涵义
URL--->表示请求行中包含的URL,该字段是一个指向url.URL结构体的指针
一个URL地址:https://cn.bing.com/search?q=192.168.237.142
url.URL.Path:拿到/search
url.URL.RowQuery:拿到q=192.168.237.142(表单中的参数Get请求)
为了更好的显示,建立使用谷歌浏览器,通过F12可以看到报文消息
我们先准备一个html文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>请求报文</title> </head> <body> <!--默认为GET请求,这里我们也指定下--> <form action="http://localhost:9090/hello"> <!--注:name标签时我们向服务器端提交信息--> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <!--注:默认为提交按钮 我们这里也指定下--> <button type="submit">提交</button> </form> </body> </html>
获取请求头
URL中的Header
type Header map[string][]string
Header是一个map:
map取值: v , ok = map[key]
Headr给我们绑定了一个方法:
那么怎么知道请求头中有哪些key呢,在你的页面,按F12-->NetWork-->点击左下边相应的文件
获取请求体(Get请求没有请求体)
准备工作:修改html文件
官方文档:
注:请求体中的内容只能读取一次
io-->io流-->管道-->队列
方法1:先获取请求体中的长度-->定义一个byte切片-->读取请求体
方法2(建议使用):
PostForm本质上是一个map
//获取请求体中的内容 2种方法 //方法1 先获取请求体中的长度-->定义一个byte切片-->读取请求体 len := r.ContentLength data := make([]byte, len) r.Body.Read(data) fmt.Fprintf(w, "请求体中的内容%v\n", string(data)) //方法2 解析表单-->获取表单中的内容 r.ParseForm() fmt.Fprintf(w, "表单中的内容%v\n", r.PostForm)
注:ParseForm字段只支持application/x-www-form-urlencoded编码
在form表单的默认编码是application/x-www-form-urlencoded。
当form中的enctype的属性值为multipart/form-data,使用PostForm字段无法获取表单中的数据
form表单的enctype属性的默认值是application/x-www-form-urlencoded编码 实现上传文件时需要将该属性设置为 multipart/form-data
此时:需要使用MultipartForm字段,不能再使用ParseForm
用法与上面相同,不做案例了
方法3:
=>通过func (*Request) FormValue¶和 func (*Request) PostFormValue
快速获取表单信息
==>与MultipartForm配套的
FormValue、PostFormValue
内部调用了PareForm(在有必要时)
区别:FormValue优先获取URL上的内容
//方法3 通过func (*Request) FormValue | PostFormValue fmt.Fprintf(w, "通过FormValue:%v\n", r.FormValue("user")) fmt.Fprintf(w, "PostFormValue:%v\n", r.PostFormValue("username"))