go,net/http库Request结构详细解析

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值没有数据。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值