Request是HTTP访问的请求对象,非常重要的一部分,正确的解析请求数据才能给客户端返回响应。
通过标准库了解到该结构的详细组成,通过简单示例验证一下。
下方是go服务端代码,解析Request各成员,或者说是属性。
// sayhello project sayhello.go
package main
import (
"fmt"
"log"
"net/http"
"strings"
)
func sayhello(w http.ResponseWriter, r *http.Request) {
// r.ParseForm() //解析参数,默认是不会解析的
//这些信息是输出到服务器端的打印信息
fmt.Println("Request解析")
//HTTP方法
fmt.Println("method", r.Method)
// RequestURI是被客户端发送到服务端的请求的请求行中未修改的请求URI
fmt.Println("RequestURI", r.RequestURI)
//URL类型,下方分别列出URL的各成员
fmt.Println("URL_scheme", r.URL.Scheme)
fmt.Println("URL_opaque", r.URL.Opaque)
fmt.Println("URL_user", r.URL.User.String())
fmt.Println("URL_host", r.URL.Host)
fmt.Println("URL_path", r.URL.Path)
fmt.Println("URL_RawQuery", r.URL.RawQuery)
fmt.Println("URL_Fragment", r.URL.Fragment)
//协议版本
fmt.Println("proto", r.Proto)
fmt.Println("protomajor", r.ProtoMajor)
fmt.Println("protominor", r.ProtoMinor)
//HTTP请求的头域
for k, v := range r.Header {
// fmt.Println("Header key:" + k)
for _, vv := range v {
fmt.Println("header key:" + k + " value:" + vv)
}
}
//判断是否multipart方式
is_multipart := false
for _, v := range r.Header["Content-Type"] {
if strings.Index(v, "multipart/form-data") != -1 {
is_multipart = true
}
}
//解析body
if is_multipart == true {
r.ParseMultipartForm(128)
fmt.Println("解析方式:ParseMultipartForm")
} else {
r.ParseForm()
fmt.Println("解析方式:ParseForm")
}
//body内容长度
fmt.Println("ContentLength", r.ContentLength)
//是否在回复请求后关闭连接
fmt.Println("Close", r.Close)
//HOSt
fmt.Println("host", r.Host)
//form
fmt.Println("Form", r.Form)
//postform
fmt.Println("PostForm", r.PostForm)
//MultipartForm
fmt.Println("MultipartForm", r.MultipartForm)
//解析MultipartForm内的文件
files := r.MultipartForm.File
for k, v := range files {
fmt.Println(k)
for _, vv := range v {
fmt.Println(k + ":" + vv.Filename)
}
}
//该请求的来源地址
fmt.Println("RemoteAddr", r.RemoteAddr)
fmt.Fprintf(w, "hello astaxie!") //这个写入到w的是输出到客户端的
}
func main() {
http.HandleFunc("/", sayhello)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
1、先实验application/x-www-form-urlencoded类型的,get请求,通过postman发送请求
服务端接收到的数据
可以接收到请求方法、URL内待的查询参数,basicauth认证信息,不过URL的user不清楚是做什么用的
2、实验application/x-www-form-urlencoded类型的,post请求,增加body内容,其他不变,通过postman发送请求,
服务端接收到的数据
可以接收到请求方法,post,form内既包含查询参数、也包含body内的参数,postform,只包含body内的参数
3、以multipart/form-data类型,发送post请求,参数为值,直接在postman的body内选form-data,输入内容即可,headers内不要手动填写Content-Type,因为还需要生成间隔符。
服务端接收到结果,可以看到,通过ParseMultipartForm解析body,在MultipartForm内有value值数据。
4、以multipart/form-data类型,发送post请求,参数为文件,直接在postman的body内选form-data,选择文件即可,headers内不要手动填写Content-Type,因为还需要生成间隔符。
服务端接收到结果,可以看到,通过ParseMultipartForm解析body,在MultipartForm内有files值有数据,value值没有数据。