目录
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等
尝试:
c.Writer.Header().Set(key, value)
: 失败!writer写的头部信息是写到response.header中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