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