gin静态测试中如何获取request.header请求头


目录

1. 请求头request.header

2. 响应头response.header

3. 获取request.header

4. 扩展

request.header(请求头)

当你使用http(https)协议请求一个网站的时候,你的浏览器会向对方的服务器发送一个http请求,这个请求同样包含三个部分

  • 请求方法 请求路径(URL) 请求协议版本
  • 报文主体
  • 参数(POST/GET)

这些讯息里面包含了你的请求方法,你请求的目的地,你的语言,以及你的浏览器的各种信息,这样对方的服务器就能靠着辨识这些讯息来辨识你的浏览器

请求头的详细介绍

举例:请求的url是google.com,以下是请求时得到的请求头

:authority: www.google.com
:method: GET
:path: /
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8
cookie: SID=HQheamp1ZRnpnNqsNVvNIc38QIhh_O-9CGcX7H6eWUZCxYHCZn4E46u4ShMcvrvLiqwTOQ.; __Secure-1PSID=HQheamp1ZRnpnNqsNVvNIc38QIhh_O-9CGcX7H6eWUZCxYHCCMnzSjv40C5ZdTRAUPPoiQ.; __Secure-3PSID=HQheamp1ZRnpnNqsNVvNIc38QIhh_O-9CGcX7H6eWUZCxYHCemrtW1Nb_Etdxh9Q0KVk-g.; HSID=AVoRcO-PIqWWA84YQ; SSID=A1pxp-2hNJVQRp9f6; APISID=EvV1W11qlwXcputQ/AW5KLX97TF27bgn2R; SAPISID=ZT_7BBUePJdpWcu_/AUALhJ_8ySVPIMkz2; __Secure-1PAPISID=ZT_7BBUePJdpWcu_/AUALhJ_8ySVPIMkz2; __Secure-3PAPISID=ZT_7BBUePJdpWcu_/AUALhJ_8ySVPIMkz2; SEARCH_SAMESITE=CgQI6pQB; NID=511=jAN1MhIujIn2-J2-8WTMHnZ_daSg26n1UixG-Zf8_joVAHHB0LFbOb9YyM2hXuNoVC_tUnOi7gr5nPJG6fIu_jd28U2Aq1XM7GJmKv7ZLVuknp159r2D6kqt46D1ywvmbzDERT9V5iGTJQnwQcX-AL9T8E7loZa-Hfg4_8w3iSWmHnOXXfBSO1OTWAmuE7qAJe_8TXw1970oxZi1eHhaM5JwSgkuHaNAyFqtGQsvKwLLv4GMaeQJiX684vZmHjai3l6g3jOZmXF9t6M; 1P_JAR=2022-02-27-16; SIDCC=AJi4QfHgmJia0hBFapjrHxzbbHpYQtDnf8Iy0Z7QETpkXMp5uS83F5ljK0Q7oakj8LWidjpXg3w; __Secure-3PSIDCC=AJi4QfEzc3o0bGq2C-MSaiylB6k1v7UYJHin1vOoT9kF137bOCMtOJ7A8pmkwsH8qxZWRSS1ng
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
sec-ch-ua-arch: "x86"
sec-ch-ua-full-version: "98.0.4758.102"
sec-ch-ua-mobile: ?0
sec-ch-ua-model: ""
sec-ch-ua-platform: "Windows"
sec-ch-ua-platform-version: "14.0.0"
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: none
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/98.0.4758.102 Safari/537.36
x-client-data: CIe2yQEIorbJAQjBtskBCKmdygEIh9LKAQj/9MoBCOvyywEInvnLAQjnhMwBCMaWzAEI4JrMAQi5m8wBCJuczAEIrZzMAQ==
Decoded:
message ClientVariations {
  // Active client experiment variation IDs.
  repeated int32 variation_id = [3300103, 3300130, 3300161, 3313321, 3320071, 3324543, 3340651, 3341470, 3342951, 3345222, 3345760, 3345849, 3345947, 3345965];
}

:authority:请求的域名
:method:请求方法
:path :请求路径,也就是 https://ww.google.com.hk/ 后面的内容
:scheme:请求的协议
Accept:客户机通过这个头,告诉服务器,它支持哪些数据类型
Accept-Encoding: 客户机通过这个头,告诉服务器,支持哪种数据压缩格式
Accept-Language: 客户机采用的是哪个语言
Cookie:客户机通过这个头,可以带点数据给服务器
Host:客户机通过这个头,告诉服务器,想访问服务器哪台主机
If-Modified-Since:客户机通过这个头,告诉服务器,数据缓存的时间
Referer:客户机通过这个头,告诉服务器,客户机是从哪个页面来的(防盗链)
User-Agent: 说明客户机操作系统信息,以及浏览器信息

response.header(响应头)

当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头,Body

  • 注:Body就是返回给你的主体,比如说请求网站返回的html

响应头讯息里包含了服务器的响应讯息,如http版本,压缩方式,响应文件类型,文件编码等

HTTP响应头的详细介绍

举例:请求的url是Google.com,以下是请求时得到的响应头

accept-ch: Sec-CH-UA-Platform-Version
accept-ch: Sec-CH-UA-Full-Version
accept-ch: Sec-CH-UA-Arch
accept-ch: Sec-CH-UA-Model
accept-ch: Sec-CH-UA-Bitness
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
bfcache-opt-in: unload
cache-control: private, max-age=0
content-encoding: br
content-length: 40715
content-type: text/html; charset=UTF-8
date: Sun, 27 Feb 2022 17:24:44 GMT
expires: -1
server: gws
set-cookie: 1P_JAR=2022-02-27-17; expires=Tue, 29-Mar-2022 17:24:44 GMT; path=/; domain=.google.com; Secure; SameSite=none
set-cookie: SIDCC=AJi4QfGcHxEQ4FjhVFL1xlagvP8dknayc2J2Y6Cr3NxGD9BaystHtEDxRC1Md45df5gdpsEh3TI; expires=Mon, 27-Feb-2023 17:24:44 GMT; path=/; domain=.google.com; priority=high
set-cookie: __Secure-3PSIDCC=AJi4QfErZEEt56pRLR5c7LzgftYAg3FuScnzaZTbdjbdSeF1t4EqQiZ3HOvplC0azU_RS7hDqw; expires=Mon, 27-Feb-2023 17:24:44 GMT; path=/; domain=.google.com; Secure; HttpOnly; priority=high; SameSite=none
strict-transport-security: max-age=31536000
x-frame-options: SAMEORIGIN
x-xss-protection: 0

Location:服务器通过这个头告诉浏览器去访问哪个页面,这个头通常配合302状态码使用
Content-Encoding : 服务器通过这个头告诉浏览器,回送的数据采用的压缩格式
Content-Length: 服务器通过这个头告诉浏览器,回送的数据的大小
Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型
date : 服务器的时间
server:服务器名
set-cookie: 是给予cookie
Last-Modified: 服务器通过这个头告诉浏览器,资源的最后修改时间
Refresh:服务器通过这个头告诉浏览器,定时刷新网页
Content-Disposition: attachment;

gin获取request.header

Header 是键值对,处理方便,Token一般都存header
简单的token,session Id,cookie id等

尝试:

  1. c.Writer.Header().Set(key, value) : 失败!writer写的头部信息是写到response.header中
  2. w.HeaderMap = map[string][]string{ "key" : ["value1",”value2]}:失败!Recorder是用于记录Response的,所以这里设置的头信息是设置响应头信息。

成果:是为了获取requset.header,而gin.Context中封装了request,我们只需要对gin.Context.request初始化赋值就好了。

import (
    "net/http/"
	"net/http/httptest"
	"github.com/gin-gonic/gin"
)

func main(){
	// 创建响应记录器,以便您可以检查响应
		w := httptest.NewRecorder()
        // create gin.Context for test
		c, _ := gin.CreateTestContext(w)
        // 获取request.header
        c.Request, _ = http.NewRequest("GET", "/net", nil)
        // 设置request.header参数
        c.Request.Header.Set("Authorization", "")
        // 获取request.header参数
        c.Request.Header.Get("Authorization")
}

gin.Context的定义

Context是 gin 中最重要的部分。它允许我们在中间件之间传递变量, 管理流程,例如验证请求的 JSON 并呈现 JSON 响应。

type Context struct {
    
    // responseWriter对ResponseWriter封装
    writermem responseWriter

    // http请求及响应writer
    Request   *http.Request
    Writer    ResponseWriter

    // 键值对切片类型
    Params   Params
    ……
}
  • gin.Context中只封装了Request,并没有gin.response
  • Param 是单个 URL 参数,由一个键和一个值组成。

NewRecorder定义

创建响应记录器,以便您可以检查响应。是用于记录响应的结构体,其header也是记录响应体的header。

func NewRecorder() *ResponseRecorder {
	return &ResponseRecorder{
		HeaderMap: make(http.Header),
		Body:      new(bytes.Buffer),
		Code:      200,
	}
}

HeaderMap http.Header

type Header map[string][]string


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM