目錄
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