亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

實現代碼

看下實現的簡單代碼

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跳轉到https://www.qq.com。我們使用curl可以看到使用302的跳轉。

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

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

看了下 client.Do 源碼實現

607 err = c.checkRedirect(req, reqs)

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

主要看下checkRedirect

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

可以看到如果設置了checkRedirect就執(zhí)行checkRedirect,如果沒有設置就執(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的跳轉就拋出錯誤結束這次請求了。

大體上流程已經搞明白。只要設置checkRedirect返回error,理論上就能實現只請求一次的目的。

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

基本實現了。

其實,在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ā)送下一個請求,并且返回最近的響應且其主體未關閉。

可以看到返回 ErrUseLastResponse是官方的建議的設置

最終的代碼實現應該是這樣的。

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)
}

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

相關文章

  • Golang通道的無阻塞讀寫的方法示例

    Golang通道的無阻塞讀寫的方法示例

    這篇文章主要介紹了Golang通道的無阻塞讀寫的方法示例,詳細的介紹了哪些情況會存在阻塞,以及如何使用select解決阻塞,非常具有實用價值,需要的朋友可以參考下
    2018-11-11
  • 手把手帶你走進Go語言之語法基礎解析

    手把手帶你走進Go語言之語法基礎解析

    這篇文章主要介紹了手把手帶你走進Go語言之語法基礎,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • GO語言延遲函數defer用法分析

    GO語言延遲函數defer用法分析

    這篇文章主要介紹了GO語言延遲函數defer用法,較為詳細的分析了GO語言的特性與具體用法,并給出了一個比較典型的應用實例,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • Go語言設置JSON的默認值操作

    Go語言設置JSON的默認值操作

    這篇文章主要介紹了Go語言設置JSON的默認值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang切片連接成字符串的實現示例

    Golang切片連接成字符串的實現示例

    本文主要介紹了Golang切片連接成字符串的實現示例,可以使用Go語言中的內置函數"String()"可以將字節(jié)切片轉換為字符串,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 從淺入深帶你掌握Golang數據結構map

    從淺入深帶你掌握Golang數據結構map

    在?Go?語言中,map?是一種非常常見的數據類型,它可以用于快速地檢索數據。本篇文章將介紹?Go?語言中的?map,包括?map?的定義、初始化、操作和優(yōu)化,需要的可以參考一下
    2023-04-04
  • 詳解Golang中string的實現原理與高效使用

    詳解Golang中string的實現原理與高效使用

    在Go語言中,無論是字符串常量、字符串變量還是代碼中出現的字符串字面量,它們的類型都被統一設置為string,下面就跟隨小編一起來了解一下Golang中string的實現原理與高效使用吧
    2024-01-01
  • 基于微服務框架go-micro開發(fā)gRPC應用程序

    基于微服務框架go-micro開發(fā)gRPC應用程序

    這篇文章介紹了基于微服務框架go-micro開發(fā)gRPC應用程序的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 初學Go必備的vscode插件及最常用快捷鍵和代碼自動補全

    初學Go必備的vscode插件及最常用快捷鍵和代碼自動補全

    這篇文章主要給大家介紹了關于初學vscode寫Go必備的vscode插件及最常用快捷鍵和代碼自動補全的相關資料,由于vscode是開源免費的,而且開發(fā)支持vscode的插件相對比較容易,更新速度也很快,需要的朋友可以參考下
    2023-07-07
  • Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn)

    Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn)

    本文主要介紹了Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn),文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論