解析请求头
// 解析请求头
func headers(w http.ResponseWriter, request *http.Request) {
// 获取所欲请求头,Header 是个 map, key 是字符串,value 是字符串切片
headers := request.Header
fmt.Printf("所有请求头headers: %v\n", headers)
// 获取单个请求头,返回的是字符串切片
// [gzip, deflate]
coding := headers["Accept-Encoding"]
fmt.Printf("Accept-Encoding: %v\n", coding)
// 获取单个请求头,如果请求头的值是多个,用逗号拼接
// gzip, deflate
coding1 := headers.Get("Accept-Encoding")
fmt.Printf("Accept-Encoding1: %v\n", coding1)
fmt.Fprintln(w, headers)
}
从流中解析请求体
直接读取 body 字节流,再转换成自己想要的格式,比较麻烦,但可以处理任何请求类型的参数
// 接请求体-原始
// 可以处理 application/json 类型的参数
func body(w http.ResponseWriter, request *http.Request) {
// 获取请求体的长度
len := request.ContentLength
body := make([]byte, len)
// 将数据读取到字节数组中
request.Body.Read(body)
fmt.Fprintln(w,string(body))
}
解析表单
- 调用ParseForm方法或者ParseMultipartForm方法,对请求进行语法分析。
- 根据步骤1调用的方法,访问相应的Form字段、PostForm字段或MultipartForm字段
// 解析表单-手动解析语法
func form(w http.ResponseWriter, request *http.Request) {
// 手动先进行语法分析
request.ParseForm()
// 再访问Form 或PostForm 字段
// Form 会同时返回 URL 上的参数值 和 form 表单中的参数值,如果两处有相同的参数,值是字符串切片
fmt.Printf("Form: %v\n",request.Form)
// PostForm 只会包含表单中的参数
fmt.Printf("PostForm: %v\n",request.PostForm)
// multipart/form-data 类型参数
// 取出1024字节数据
request.ParseMultipartForm(1024)
fmt.Printf("multipart: %v\n",request.MultipartForm)
}
直接获取表单值
因为Formvalue方法即使在给定键拥有多个值的情况下,也只会从Form结构中取出给定键的第一个值,所以如果想要获取给定键包含的所有值,那么就需要直接访问Form结构
// 解析表单-自动解析语法
func formValue(w http.ResponseWriter, request *http.Request) {
// FormValue 方法会自动调用 ParseForm 或 ParseMultipartForm 方法
// 如果参数有多个值,只会取第一个, 如果需要获取全部值,用Form字段
request.FormValue("userId")
// PostFormValue 同上,但只包含表单中的参数,包含URl中参数
request.PostFormValue("name")
}
获取文件
func uploadFile(w http.ResponseWriter, request *http.Request) {
// 第一种方法,解析文件流
request.ParseMultipartForm(1024)
// 取出文件头
fileHeader := request.MultipartForm.File["uploaded"][0]
// 打开文件
file, err := fileHeader.Open()
if err != nil {
data ,err := ioutil.ReadAll(file)
if err != nil {
// 将文件写入响应体
fmt.Println("file: ", string(data))
}
}
// 第二种,FormFile 方法
file1,_, err := request.FormFile("uploaded1")
if err != nil {
data, err := ioutil.ReadAll(file1)
if err != nil {
fmt.Println("file1: ", string(data))
}
}
}
完整代码
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main(){
server := http.Server{
Addr: "127.0.0.1:8080",
}
http.HandleFunc("/header",headers)
http.HandleFunc("/body",body)
http.HandleFunc("/form",form)
http.HandleFunc("/formValue",formValue)
http.HandleFunc("/uploadFile",uploadFile)
server.ListenAndServe()
}
func uploadFile(w http.ResponseWriter, request *http.Request) {
// 第一种方法,解析文件流
request.ParseMultipartForm(1024)
// 取出文件头
fileHeader := request.MultipartForm.File["uploaded"][0]
// 打开文件
file, err := fileHeader.Open()
if err != nil {
data ,err := ioutil.ReadAll(file)
if err != nil {
// 将文件写入响应体
fmt.Println("file: ", string(data))
}
}
// 第二种,FormFile 方法
file1,_, err := request.FormFile("uploaded1")
if err != nil {
data, err := ioutil.ReadAll(file1)
if err != nil {
fmt.Println("file1: ", string(data))
}
}
}
// 解析表单-自动解析语法
func formValue(w http.ResponseWriter, request *http.Request) {
// FormValue 方法会自动调用 ParseForm 或 ParseMultipartForm 方法
// 如果参数有多个值,只会取第一个, 如果需要获取全部值,用Form字段
request.FormValue("userId")
// PostFormValue 同上,但只包含表单中的参数,包含URl中参数
request.PostFormValue("name")
}
// 解析表单-手动解析语法
func form(w http.ResponseWriter, request *http.Request) {
// 手动先进行语法分析
request.ParseForm()
// 再访问Form 或PostForm 字段
// Form 会同时返回 URL 上的参数值 和 form 表单中的参数值,如果两处有相同的参数,值是字符串切片
fmt.Printf("Form: %v\n",request.Form)
// PostForm 只会包含表单中的参数
fmt.Printf("PostForm: %v\n",request.PostForm)
// multipart/form-data 类型参数
// 取出1024字节数据
request.ParseMultipartForm(1024)
fmt.Printf("multipart: %v\n",request.MultipartForm)
}
// 接请求体-原始
// 可以处理 application/json 类型的参数
func body(w http.ResponseWriter, request *http.Request) {
// 获取请求体的长度
len := request.ContentLength
body := make([]byte, len)
// 将数据读取到字节数组中
request.Body.Read(body)
fmt.Fprintln(w,string(body))
}
// 解析请求头
func headers(w http.ResponseWriter, request *http.Request) {
// 获取所欲请求头,Header 是个 map, key 是字符串,value 是字符串切片
headers := request.Header
fmt.Printf("所有请求头headers: %v\n", headers)
// 获取单个请求头,返回的是字符串切片
// [gzip, deflate]
coding := headers["Accept-Encoding"]
fmt.Printf("Accept-Encoding: %v\n", coding)
// 获取单个请求头,如果请求头的值是多个,用逗号拼接
// gzip, deflate
coding1 := headers.Get("Accept-Encoding")
fmt.Printf("Accept-Encoding1: %v\n", coding1)
fmt.Fprintln(w, headers)
}