校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 詳解golang開發中http請求redirect的問題

詳解golang開發中http請求redirect的問題

熱門標簽:江蘇呼叫中心外呼系統有效果嗎 利用地圖標注位置 400開頭電話怎樣申請 官渡電銷外呼管理系統怎么收費 地圖區域圖標注后導出 赤峰電銷 杭州人工智能電銷機器人費用 谷歌美發店地圖標注 貴州電話智能外呼系統

這兩天在開發項目的時候遇到了一個問題,請求了一個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 的狀態碼。發現沒法實現了,所以看了下源碼。

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就執行checkRedirect,如果沒有設置就執行 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,以控制如何處理重定向。 如果返回,則不發送下一個請求,并且返回最近的響應且其主體未關閉。

可以看到返回 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開發中http請求redirect的問題的文章就介紹到這了,更多相關golang http請求redirect內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • golang http請求封裝代碼
  • Golang發送http GET請求的示例代碼
  • golang使用http client發起get和post請求示例
  • 詳解golang中發送http請求的幾種常見情況
  • golang編程入門之http請求天氣實例
  • golang高性能的http請求 fasthttp詳解

標簽:宜春 武漢 泰安 鷹潭 松原 保定 河池 黔西

巨人網絡通訊聲明:本文標題《詳解golang開發中http請求redirect的問題》,本文關鍵詞  詳解,golang,開發,中,http,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解golang開發中http請求redirect的問題》相關的同類信息!
  • 本頁收集關于詳解golang開發中http請求redirect的問題的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 新乐市| 东海县| 海淀区| 吴旗县| 易门县| 南涧| 高安市| 九龙坡区| 岳西县| 马关县| 乡宁县| 如皋市| 车险| 旬阳县| 鹤山市| 北碚区| 沛县| 黔西县| 河曲县| 西畴县| 商洛市| 靖州| 阿克陶县| 财经| 罗城| 普兰县| 宜良县| 天峻县| 神农架林区| 文成县| 安泽县| 德格县| 灵璧县| 和林格尔县| 阿拉善盟| 宜良县| 邵阳县| 杭州市| 贵溪市| 高尔夫| 璧山县|