标签:user 自动 mui func http webp list min requests
Go 语言的 net/http 包提供了一系列用于表示 HTTP 报文的结构,我们可以使用它
处理请求和发送相应,其中 Request 结构代表了客户端发送的请求报文,下面让我们看
一下 Request 结构体
Request 结构中的 URL 字段用于表示请求行中包含的 URL,改字段是一个指向
url.URL 结构的指针
注: 通过 r.URL.Path 只能得到 /hello
获取请求的 URL 后面?后面的查询字符串
例如:http://localhost:8080/hello?username=admin&password=123456
注: 通过 r.URL.RawQuery 得到的是 username=admin&password=123456
通过 Request 结果中的 Header 字段用来获取请求头中的所有信息,Header 字段
的类型是 Header 类型,而 Header 类型是一个 map[string][]string,string 类型的 key,
string 切片类型的值。
r.Header
map[User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36]
Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,ima
ge/apng,*/*;q=0.8] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-
CN,zh;q=0.9,en-US;q=0.8,en;q=0.7] Connection:[keep-alive] Upgrade-Insecure-
Requests:[1]]
方式一:r.Header[“Accept-Encoding”]
方式二:r.Header.Get(“Accept-Encoding”)
请求和响应的主体都是有 Request 结构中的 Body 字段表示,这个字段的类型是
io.ReadCloser 接口,该接口包含了 Reader 接口和 Closer 接口,Reader 接口拥有 Read
方法,Closer 接口拥有 Close 方法
由于 GET 请求没有请求体,所以我们需要在 HTML 页面中创建一个 form 表单,通
过指定 method=”post”来发送一个 POST 请求
<html>
<head>
<meta charset="UTF-8"/>
</head>
<body>
<form action="http://localhost:8080/getBody" method="POST" enctype="multipart/form-data">
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" />
</form>
</body>
</html>
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
//获取内容的长度
length := r.ContentLength
//创建一个字节切片
body := make([]byte, length)
//读取请求体
r.Body.Read(body)
fmt.Fprintln(w, "请求体中的内容是:", string(body))
}
func main() {
http.HandleFunc("/getBody", handler)
http.ListenAndServe(":8080", nil)
}
在浏览器上显示的结果
下面我们就通过 net/http 库中的 Request 结构的字段以及方法获取请求 URL 后面
的请求参数以及 form 表单中提交的请求参数
1) 类型是 url.Values 类型,Form 是解析好的表单数据,包括 URL 字段的 query
参数和 POST 或 PUT 的表单数据。
2) Form 字段只有在调用 Request 的 ParseForm 方法后才有效。在客户端,会忽
略请求中的本字段而使用 Body 替代
1) 获取表单中提交的请求参数(username 和 password)
func handler(w http.ResponseWriter, r *http.Request) {
//解析表单
r.ParseForm()
//获取请求参数
fmt.Fprintln(w, "请求参数为:", r.Form)
}
//注意:在执行 r.Form 之前一定要调用 ParseForm 方法
//结果
//请求参数为: map[password:[666666] username:[hanzong]]
<form
action="http://localhost:8080/getBody?username=admin&pwd=123456"
method="POST">
用 户 名 : <input type="text" name="username"
value="hanzong"><br/>
密 码 : <input type="password" name="password"
value="666666"><br/>
<input type="submit">
</form>
则执行结果如下:
请求参数为:map[username:[hanzong admin] password:[666666] pwd:[123456]]
1) 类型也是 url.Values 类型,用来获取表单中的请求参数
func handler(w http.ResponseWriter, r *http.Request) {
//解析表单
r.ParseForm()
//获取请求参数
fmt.Fprintln(w, "请求参数为:", r.PostForm)
}
请求参数为:map[username:[hanzong] password:[666666]]
2) 但是 PostForm 字段只支持 application/x-www-form-urlencoded 编码,如果
form 表单的 enctype 属性值为 multipart/form-data,那么使用 PostForm 字段
无法获取表单中的数据,此时需要使用 MultipartForm 字段
a) 可以通过 FormValue 方法快速地获取某一个请求参数,该方法调用之前
会自动调用 ParseMultipartForm 和 ParseForm 方法对表单进行解析
func handler(w http.ResponseWriter, r *http.Request) {
//获取请求参数
fmt.Fprintln(w, "请求参数username的值为:", r.FormValue("username"))
}
请求参数 username 的值为: hanzong
a) 可以通过 PostFormValue 方法快速地获取表单中的某一个请求参数,该
方法调用之前会自动调用 ParseMultipartForm 和 ParseForm 方法对表单
进行解析
func handler(w http.ResponseWriter, r *http.Request) {
//获取请求参数
fmt.Fprintln(w, "请求参数 username 的值为:", r.PostFormValue("username"))
}
为了取得 multipart/form-data 编码的表单数据,我们需要用到 Request 结构的
ParseMultipartForm 方法和 MultipartForm 字段,我们通常上传文件时会将 form 表单的
enctype 属性值设置为 multipart/form-data
1) 表单
<form action="http://localhost:8080/upload" method="POST"
enctype="multipart/form-data">
用 户 名 : <input type="text" name="username"
value="hanzong"><br/>
文件:<input type="file" name="photo" /><br/>
<input type="submit">
</form>
1) 后台处理请求代码
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
//解析表单
r.ParseMultipartForm(1024)
fmt.Fprintln(w, r.MultipartForm)
}
func main() {
http.HandleFunc("/upload", handler)
http.ListenAndServe(":8080", nil)
}
3) 浏览器显示结果
&{map[username:[hanzong]] map[photo:[0xc042126000]]}
MuiltipartForm 字段的类型为 *multipart.Form,multipart 包下 Form 结构的指
针类型
打开上传的文件
func handler(w http.ResponseWriter, r *http.Request) {
//解析表单
r.ParseMultipartForm(1024)
fileHeader := r.MultipartForm.File["photo"][0]
file, err := fileHeader.Open()
if err == nil {
data, err := ioutil.ReadAll(file)
if err == nil {
fmt.Fprintln(w, string(data))
}
}
}
net/http 提供的 FormFile 方法可以快速的获取被上传的文件,但是只能处理上
传一个文件的情况。
func handler(w http.ResponseWriter, r *http.Request) {
file, _, err := r.FormFile("photo")
if err == nil {
data, err := ioutil.ReadAll(file)
if err == nil {
fmt.Fprintln(w, string(data))
}
}
}
标签:user 自动 mui func http webp list min requests
原文地址:https://www.cnblogs.com/ygjzs/p/12052005.html