解析请求头和请求体

解析请求头

// 解析请求头
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))

}

解析表单

  1. 调用ParseForm方法或者ParseMultipartForm方法,对请求进行语法分析。
  2. 根据步骤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)
}