• 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
    
  • 相关阅读:
    SQL必知必会-笔记(五)函数
    软件测试面试题:系统中的图片不显示如何排查原因
    windows用浏览器访问linux目录文件
    记测试工作中一次印象深刻的事
    怎么快速适应新的测试工作?
    xshell如何导出日志文件和上传文件
    jmeter+fiddler高效率整理接口脚本
    python-用requests库处理form-data格式的参数
    软件自动化测试工程师面试题集锦(4)
    shell脚本批量检查某个或多个服务的端口和进程是否正常
  • 原文地址:https://www.cnblogs.com/richxan/p/15943946.html
Copyright © 2020-2023  润新知