1.1获取请求 URL
// 建立一个处理器
//获取请求行里面的信息
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, “已经发送请求地址”, r.URL.Path)
fmt.Fprintln(w, “已经发送请求地址后请求的查询字符串”, r.URL.RawQuery)
//通过 r.URL.RawQuery 得到的是 username=admin&password=123456
//通过 r.URL.RawQuery 得到的是 username=admin&password=123456
}
func main() {
http.HandleFunc("/hello", handler)
http.ListenAndServe(":8080", nil)
}
1.2获取请求头中的信息通过 Request 结果中的 Header 字段用来获取请求头中的所有信息,Header 字段
的类型是 Header 类型,而 Header 类型是一个 map[string][]string,string 类型的 key,string 切片类型的值。大小写是敏感的
// 建立一个处理器
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, “已经发送请求地址”, r.URL.Path)
fmt.Fprintln(w, “已经发送请求地址后请求的查询字符串”, r.URL.RawQuery)
fmt.Fprintln(w, “请求头中所有的信息”, r.Header) //请求头是一个map类型 获取其中的信息要知道key值 可直接获取也可使用Get方法
fmt.Fprintln(w, “请求头中所有的信息“Accept-Encoding””, r.Header[“Accept-Encoding”]) //切片
// 与上面一样
fmt.Fprintln(w, “请求头中所有的信息“Accept-Encoding”的属性值”, r.Header.Get(“Accept-Encoding”)) //值
1.3获取请求体中的信息
请求和响应的主体都是有 Request 结构中的 Body 字段表示,这个字段的类型是
io.ReadCloser 接口,该接口包含了 Reader 接口和 Closer 接口,Reader 接口拥有 Read方法,Closer 接口拥有 Close 方法
// 获取请求体中内容的长度
len := r.ContentLength
// 创建byte切片
body := make([]byte, len)
// 将请求体中的读取到body中
r.Body.Read(body)
// 在浏览器中显示
fmt.Fprintln(w, "请求体中的内容有", string(body))
由于 GET 请求没有请求体,所以我们需要在 HTML 页面中创建一个 form 表单,通
过指定 method=”post”来发送一个 POST 请求
密 码 :
>
请求体中的内容有: username=admin&password=123456
以上的方式就是为了获取表单提交的信息 用于进行后续的操作
也可以通过Form字段获取表单提交的信息
1.4获取请求参数
下面我们就通过 net/http 库中的 Request 结构的字段以及方法获取请求 URL 后面
的请求参数以及 form 表单中提交的请求参数(先要解析表单 Form中才会有表单数据)
1.4.1 Form 字段
Form 字段只有在调用 Request 的 ParseForm 方法后才有效。在客户端,会忽
略请求中的本字段而使用 Body 替代表单中的请求参数的值排在 URL 请求参数值的前面
1.4.2 PostForm字段 只获取表单中的请求参数
类型也是 url.Values 类型,用来获取表单中的请求参数
但是 PostForm 字段只支持 application/x-www-form-urlencoded 编码,如果
form 表单的 enctype 属性值为 multipart/form-data,那么使用 PostForm 字段
无法获取表单中的数据,此时需要使用 MultipartForm 字段
说明:form 表单的 enctype 属性的默认值是 application/x-www-form-
urlencoded 编 码 , 实 现 上 传 文 件 时 需 要 讲 该 属 性 的 值 设 置 为
multipart/form-data 编码格式
// 解析表单 在调用r.Form之前必须执行该操作
r.ParseForm()
// 获取请求参数
fmt.Fprintln(w, "请求参数有", r.Form)
fmt.Fprintln(w, "Post请求的Form表单参数有", r.PostForm)
在执行 r.Form 之前一定要调用 ParseForm 方法,上述方法会得到get以及post的所有的提交的参数信息
1.4.3 FormValue 方法和 PostFormValue 方法(这个方法不需要调用r.ParseForm)
1) FormValue 方法
a) 可以通过 FormValue 方法快速地获取某一个请求参数,该方法调用之前
会自动调用 ParseMultipartForm 和 ParseForm 方法对表单进行解析
2) PostFormValue 方法
a) 可以通过 PostFormValue 方法快速地获取表单中的某一个请求参数,该
方法调用之前会自动调用 ParseMultipartForm 和 ParseForm 方法对表单
进行解析
fmt.Fprintln(w, "请求参数有:", r.FormValue("username")) //请求参数有: admin
fmt.Fprintln(w, "Post请求的表单参数有:", r.PostFormValue("username"))//Post请求的表单参数有: admin
1.4.4 MultipartForm 字段
为了取得 multipart/form-data 编码的表单数据,我们需要用到 Request 结构的
ParseMultipartForm 方法和 MultipartForm 字段,我们通常上传文件时会将 form 表单的
enctype 属性值设置为 multipart/form-data
1.5给客户端响应
http.ResponseWriter 来给用户响应
1.5.1给客户端响应一个字符串
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("你的请求我已经收到"))
}
1.5.2给客户端响应一个 HTML 页面
func handler(w http.ResponseWriter, r *http.Request) {
html := `<html>
<head>
<title>测试响应内容为网页</title>
<meta charset="utf-8"/>
</head>
<body>
我是以网页的形式响应过来的!
</body>
</html>`
w.Write([]byte(html))
}
1.5.3给客户端响应 JSON 格式的数据
func handler(w http.ResponseWriter, r *http.Request) {
//设置响应头中内容的类型
w.Header().Set("Content-Type", "application/json")
user := User{
ID: 1,
Username: "admin",
Password: "123456",
}
//将 user 转换为 json 格式
json, _ := json.Marshal(user)
w.Write(json)
}
1.5.4让客户端重定向
func handler(w http.ResponseWriter, r *http.Request) {
//以下操作必须要在 WriteHeader 之前进行
w.Header().Set("Location", "https:www.baidu.com")
w.WriteHeader(302)
}
//这只是重定向的一种方式 我们都是用模板引擎进行重定向