第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用客戶端為每個(gè) HTTP 請求添加標(biāo)頭

使用客戶端為每個(gè) HTTP 請求添加標(biāo)頭

Go
飲歌長嘯 2023-06-01 09:57:53
我知道我可以使用手動(dòng)向每個(gè) HTTP 請求添加標(biāo)頭cli := &http.Client{}req, err := http.NewRequest("GET", "https://myhost", nil)req.Header.Add("X-Test", "true")if err != nil {    panic(err)}rsp, err := cli.Do(req)但我想為我的應(yīng)用程序中的每個(gè) HTTP 請求自動(dòng)添加此標(biāo)頭。最好的方法是什么?
查看完整描述

2 回答

?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊

我知道三種可能的解決方案。按照(我的)偏好順序:


http.NewRequest用添加所需標(biāo)頭的自定義代碼包裝:


 func MyRequest(method, path string, body io.Reader) (*http.Request, error) {

     req, err := http.NewRequest(method, path, body)

     if err != nil {

         return nil, err

     }

     req.Header.Add("X-Test", "true")

     return req, nil

 }

這種方法的優(yōu)點(diǎn)是直接、非魔法且可移植。它將與添加自己的標(biāo)頭或設(shè)置自定義傳輸?shù)娜魏蔚谌杰浖黄鹗褂谩?/p>


唯一不起作用的情況是您依賴第三方庫來創(chuàng)建 HTTP 請求。我希望這種情況很少見(我不記得在我自己的經(jīng)歷中遇到過這種情況)。即使在這種情況下,也許您也可以改為包裝該調(diào)用。


包裝調(diào)用以client.Do添加標(biāo)頭,以及可能的任何其他共享邏輯。


 func MyDo(client *http.Client, req *http.Request) (*http.Response, error) {

     req.Header.Add("X-Test", "true")

     // Any other common handling of the request

     res, err := client.Do(req)

     if err != nil {

         return nil, err

     }

     // Any common handling of response

     return res, nil

 }

這種方法也很直接,并且具有額外的優(yōu)勢(超過#1)可以輕松減少其他樣板文件。這種通用方法也可以很好地與#1 結(jié)合使用。一個(gè)可能的缺點(diǎn)是您必須始終MyDo直接調(diào)用您的方法,這意味著您不能依賴調(diào)用自身的第三方軟件http.Do。


使用自定義http.Transport


 type myTransport struct{}


 func (t *myTransport) RoundTrip(req *http.Request) (*http.Response, error) {

     req.Header.Add("X-Test", "true")

     return http.DefaultTransport.RoundTrip(req)

 }

然后像這樣使用它:


 client := &Client{Transport: &myTransport{}}

 req := http.NewRequest("GET", "/foo", nil)

 res, err := client.Do(req)

這種方法的優(yōu)點(diǎn)是可以在幾乎任何其他軟件的“幕后”工作,因此如果您依賴第三方庫來創(chuàng)建對象http.Request并調(diào)用http.Do,這可能是您唯一的選擇。


但是,這具有不明顯的潛在缺點(diǎn),如果您使用任何也設(shè)置自定義傳輸?shù)牡谌杰浖o需費(fèi)心遵守現(xiàn)有的自定義傳輸),則可能會(huì)中斷。


最終,您使用哪種方法將取決于您需要第三方軟件的可移植性類型。但如果這不是問題,我建議使用最明顯的解決方案,據(jù)我估計(jì),這就是上面提供的順序。


查看完整回答
反對 回復(fù) 2023-06-01
?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊

可以配置http.Client為使用自定義傳輸,它可以處理客戶端中的每個(gè)請求(在golang.org/x/oauth2庫中找到此實(shí)現(xiàn))。此示例將標(biāo)頭附加到每個(gè) http 請求:

type transport struct {

    headers map[string]string

    base    http.RoundTripper

}


func (t *transport) RoundTrip(req *http.Request) (*http.Response, error) {

    for k, v := range t.headers {

        req.Header.Add(k, v)

    }

    base := t.base

    if base == nil {

        base = http.DefaultTransport

    }

    return base.RoundTrip(req)

}


func main() {

    cli := &http.Client{

        Transport: &transport{

            headers: map[string]string{

                "X-Test": "true",

            },

        },

    }

    rsp, err := cli.Get("http://localhost:8080")

    defer rsp.Body.Close()

    if err != nil {

        panic(err)

    }

}


查看完整回答
反對 回復(fù) 2023-06-01
  • 2 回答
  • 0 關(guān)注
  • 182 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號