如何用gomock出request.header
request.header(请求头)
当你使用http(https)协议请求一个网站的时候,你的浏览器会向对方的服务器发送一个http请求,这个请求同样包含三个部分
-
请求方法 请求路径(URL) 请求协议版本
-
- 例:GET https://www.google.com.hk/ HTTP/1.1
-
报文主体
-
(POST/GET)参数
这些讯息里面包含了你的请求方法,你请求的目的地,你的语言,以及你的浏览器的各种信息,这样对方的服务器就能靠着辨识这些讯息来辨识你的浏览器
请求头的详细介绍
举例:请求的url是google.com.hk
:authority: www.google.com.hk # 请求的域名(对方的服务器地址)
:method: GET # 请求方法,一般浏览器访问网站使用GET请求
:path: /?gws_rd=ssl # 请求路径,也就是 https://ww.google.com.hk/ 后面的内容
:scheme: https # 请求的协议,这里使用https协议(使用SSL加密的http协议)
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng响应头,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
# 请求文件类型,可以吧这里的文件类型Google一下,因为篇幅太长这里就不做详细介绍了(如text/html是文档/HTML文档的意思)
accept-encoding: gzip, deflate, br # 压缩类型,支援gzip,deflate,br 压缩方式
accept-language: zh-HK,zh;q=0.9 # 浏览器语言,我的默认语言是 zh-hk (中国-香港)
cache-control: no-cache # 缓存讯息,这里是 不缓存(no-cache)
pragma: no-cache # 缓存来源
sec-fetch-dest: document # sec-fetch-* 意为如何使用返回的参数
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1 # 不用在意这个东西
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63
# 非常重要的浏览器UA,表明了浏览器的身份:是什么内核,运行在什么系统上
response.header(响应头)
当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头,Body
- 注:Body就是返回给你的主体,比如说请求网站返回的html
响应头讯息里包含了服务器的响应讯息,如http版本,压缩方式,响应文件类型,文件编码等
HTTP响应头的详细介绍
alt-svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
# 标示这个请求使用http/3 (google已经用上h3了啊)
cache-control: private, max-age=0 # 缓存控制:私有(缓存0秒,也就是不缓存)
content-encoding: gzip # 压缩使用Gzip压缩
content-length: 67582 # HTTP消息长度 67582
content-type: text/html; charset=UTF-8 # 返回文件类型 text/html ,字符编码为 UTF-8
date: Tue, 10 Nov 2020 01:06:54 GMT # 服务器的时间
expires: -1 # 链接过期,-1不过期
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info." #个人隐私安全平台项目,可以去wiki查询一下p3p
server: gws # 服务器名,这个其实可以自定义,一般用于标示自己用的是什么web服务器
set-cookie: 1P_JAR=2020-11-10-01; expires=Thu, 10-Dec-2020 01:06:54 GMT; path=/; domain=.google.com.hk; Secure; SameSite=none
set-cookie: NID=204=Zl-c80ku7NgAF7VKJt84n2Z4DGob3kh9RCnBCaf21NgeIKVA7GsixU8st4FdJvPODEnS_EYoXKbPOrdhxKI_Si4k2PeLInLNoE5KNlBC1DKyZHP1z0GLesmx8sN-H4hFUe3cvrUDJMyUTq6rTyG8DL4X-rRLcgn1Iy32UlaxFDo; expires=Wed, 12-May-2021 01:06:54 GMT; path=/; domain=.google.com.hk; Secure; HttpOnly; SameSite=none
# set-cookie 是给予cookie
status: 200 # 状态码,非必要
strict-transport-security: max-age=31536000
x-frame-options: SAMEORIGIN
x-xss-protection: 0
gomock出request.header
func TestGetRequestHeader(t *testing.T) {
Convey("GetRequestHeader", t, func() {
//mock gin
gin.SetMode(gin.TestMode)
ctl := gomock.NewController(t)
defer ctl.Finish()
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
//mock出request.header
c.Request, _ = http.NewRequest("GET", "/net", nil)
c.Request.Header.Set("Authorization", "")
})
}
ctl := gomock.NewController(t)
:返回gomock.Controller
,它代表 mock 生态系统中的顶级控件。定义了 mock 对象的范围、生命周期和期待值。另外它在多个 goroutine 中是安全的defer ctl.Finish()
:进行 mock 用例的期望值断言,一般会使用defer
延迟执行,以防止我们忘记这一操作w := httptest.NewRecorder()
:创建响应记录器,以便您可以检查响应。- 调用EXPECT()为你的mock对象设置各种期望和返回值。
gin.Context的定义
type Context struct {
// responseWriter对ResponseWriter封装
writermem responseWriter
// http请求及响应writer
Request *http.Request
Writer ResponseWriter
// 键值对切片类型
Params Params
……
}
- gin.Context中只封装了Request,并没有gin.response
- Param 是单个 URL 参数,由一个键和一个值组成。