如何用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 参数,由一个键和一个值组成。