最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解golang開發(fā)中http請求redirect的問題

 更新時間:2020年10月27日 09:55:29   作者:飛翔碼農(nóng)  
這篇文章主要介紹了詳解golang開發(fā)中http請求redirect的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

這兩天在開發(fā)項目的時候遇到了一個問題,請求了一個URL,它會302到另一個地址,本意上只是想檢查這個URL是否會做3XX的redirect跳轉(zhuǎn),結(jié)果每次reqeust都會返回最后一跳的結(jié)果。后來就看了下源碼,了解下請求跳轉(zhuǎn)的機制

實現(xiàn)代碼

看下實現(xiàn)的簡單代碼

func main() {
 client := &http.Client{}
 url := "http://www.qq.com"
 reqest, err := http.NewRequest("GET", url, nil)
 if err != nil {
 panic(err)
 }
 response, _ := client.Do(reqest)
 fmt.Println(response.Status)
}

curl http://www.qq.com
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>stgw/1.3.12.4_1.13.5</center>
</body>
</html>

我們知道在瀏覽器里面輸入http://www.qq.com會302跳轉(zhuǎn)到https://www.qq.com。我們使用curl可以看到使用302的跳轉(zhuǎn)。

可是我只想獲取第一跳的的response 的狀態(tài)碼。發(fā)現(xiàn)沒法實現(xiàn)了,所以看了下源碼。

http請求為什么可以做到多次redirect

看了下 client.Do 源碼實現(xiàn)

607 err = c.checkRedirect(req, reqs)

代碼的上下文,可以看出 req是將要請求的request,reqs已經(jīng)請求過的request

主要看下checkRedirect

func (c *Client) checkRedirect(req *Request, via []*Request) error {
 fn := c.CheckRedirect
 if fn == nil {
 fn = defaultCheckRedirect
 }
 return fn(req, via)
}

可以看到如果設(shè)置了checkRedirect就執(zhí)行checkRedirect,如果沒有設(shè)置就執(zhí)行 defaultCheckRedirect。

再看下 defaultCheckRedirect

func defaultCheckRedirect(req *Request, via []*Request) error {
 if len(via) >= 10 {
 return errors.New("stopped after 10 redirects")
 }
 return nil
}

可以看到最多可以redirect 10次,如果大于10的跳轉(zhuǎn)就拋出錯誤結(jié)束這次請求了。

大體上流程已經(jīng)搞明白。只要設(shè)置checkRedirect返回error,理論上就能實現(xiàn)只請求一次的目的。

func main() {
 client := &http.Client{}
 url := "http://www.qq.com"
 reqest, err := http.NewRequest("GET", url, nil)
 if err != nil {
 panic(err)
 }
 client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
 return fmt.Errorf("first response")
 }
 response, _ := client.Do(reqest)
 fmt.Println(response.StatusCode)
}

/private/var/folders/4h/lrsc4fyd12v9ctl31ggk5ckc0000gp/T/___go_build_main_go #gosetup
302

基本實現(xiàn)了。

其實,在CheckRedirect方法上面有一行說明,

ErrUseLastResponse can be returned by Client.CheckRedirect hooks to control how redirects are processed. If returned, the next request is not sent and the most recent response is returned with its body unclosed.

Client.CheckRedirect掛鉤可以返回ErrUseLastResponse,以控制如何處理重定向。 如果返回,則不發(fā)送下一個請求,并且返回最近的響應(yīng)且其主體未關(guān)閉。

可以看到返回 ErrUseLastResponse是官方的建議的設(shè)置

最終的代碼實現(xiàn)應(yīng)該是這樣的。

func main() {
 client := &http.Client{}
 url := "http://www.qq.com"
 reqest, err := http.NewRequest("GET", url, nil)
 if err != nil {
 panic(err)
 }
 client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
 return http.ErrUseLastResponse
 }
 response, _ := client.Do(reqest)
 fmt.Println(response.StatusCode)
}

到此這篇關(guān)于詳解golang開發(fā)中http請求redirect的問題的文章就介紹到這了,更多相關(guān)golang http請求redirect內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 詳解Golang時間處理的踩坑及解決

    詳解Golang時間處理的踩坑及解決

    在各個語言之中都有時間類型的處理,這篇文章主要和大家分享一下Golang進行時間處理時哪里最容易踩坑以及解決方法,需要的可以參考一下
    2023-01-01
  • 手把手帶你走進Go語言之條件表達(dá)式

    手把手帶你走進Go語言之條件表達(dá)式

    條件表達(dá)式由條件運算符構(gòu)成,并常用條件表達(dá)式構(gòu)成一個賦值語句,本文給大家介紹了在Go語言中條件表達(dá)式的具體用法,講述的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-09-09
  • golang實現(xiàn)http服務(wù)器處理靜態(tài)文件示例

    golang實現(xiàn)http服務(wù)器處理靜態(tài)文件示例

    這篇文章主要介紹了golang實現(xiàn)http服務(wù)器處理靜態(tài)文件的方法,涉及Go語言基于http協(xié)議處理文件的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 詳解Golang的GC三色標(biāo)記法

    詳解Golang的GC三色標(biāo)記法

    這篇文章主要為大家介紹了Golang的GC三色標(biāo)記法,文中有詳細(xì)的實現(xiàn)過程供大家參考,對大家的學(xué)習(xí)或工作有一定幫助,感興趣的可以跟著小編一來看看
    2023-05-05
  • 使用Go實現(xiàn)健壯的內(nèi)存型緩存的方法

    使用Go實現(xiàn)健壯的內(nèi)存型緩存的方法

    這篇文章主要介紹了使用Go實現(xiàn)健壯的內(nèi)存型緩存,本文比較了字節(jié)緩存和結(jié)構(gòu)體緩存的優(yōu)劣勢,介紹了緩存穿透、緩存錯誤、緩存預(yù)熱、緩存?zhèn)鬏?、故障轉(zhuǎn)移、緩存淘汰等問題,并對一些常見的緩存庫進行了基準(zhǔn)測試,需要的朋友可以參考下
    2022-05-05
  • Golang操作DuckDB實戰(zhàn)案例分享

    Golang操作DuckDB實戰(zhàn)案例分享

    DuckDB是一個嵌入式SQL數(shù)據(jù)庫引擎,它與眾所周知的SQLite非常相似,但它是為olap風(fēng)格的工作負(fù)載設(shè)計的,DuckDB支持各種數(shù)據(jù)類型和SQL特性,憑借其在以內(nèi)存為中心的環(huán)境中處理高速分析的能力,它迅速受到數(shù)據(jù)科學(xué)家和分析師的歡迎,在這篇博文中,我們將探索在Go中使用DuckDB
    2025-01-01
  • Go編程中常見錯誤和不良實踐解析

    Go編程中常見錯誤和不良實踐解析

    這篇文章主要為大家介紹了Go編程中常見錯誤和不良實踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • go的strings用法小結(jié)

    go的strings用法小結(jié)

    strings 是 Go 語言標(biāo)準(zhǔn)庫中提供的一個包,用于處理字符串相關(guān)的操作,本文主要介紹了go的strings用法小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Go操作etcd的實現(xiàn)示例

    Go操作etcd的實現(xiàn)示例

    etcd是近幾年比較火熱的一個開源的、分布式的鍵值對數(shù)據(jù)存儲系統(tǒng),提供共享配置、服務(wù)的注冊和發(fā)現(xiàn),本文主要介紹etcd的安裝和使用,感興趣的可以了解一下
    2021-09-09
  • 淺析Golang中的協(xié)程(goroutine)

    淺析Golang中的協(xié)程(goroutine)

    在Go語言中,協(xié)程(goroutine)是輕量級的線程,它是Go語言中實現(xiàn)并發(fā)編程的基礎(chǔ),Go語言中的協(xié)程是由Go運行時調(diào)度器(scheduler)進行管理和調(diào)度的,本文將給大家簡單的介紹一下Golang中的協(xié)程,需要的朋友可以參考下
    2023-05-05

最新評論

辽宁省| 嘉黎县| 玉环县| 岐山县| 阳原县| 威远县| 柳林县| 九寨沟县| 雷波县| 马鞍山市| 台北县| 湘乡市| 秦皇岛市| 中山市| 高清| 霍邱县| 嵩明县| 怀仁县| 望江县| 海阳市| 西充县| 象山县| 龙游县| 汝州市| 琼海市| 天全县| 九龙坡区| 深水埗区| 昌乐县| 和田市| 宜川县| 澄江县| 东丰县| 称多县| 湛江市| 桂阳县| 康马县| 横峰县| 平顺县| 惠州市| 仪陇县|