濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 詳解golang開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題

詳解golang開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題

熱門(mén)標(biāo)簽:江蘇呼叫中心外呼系統(tǒng)有效果嗎 利用地圖標(biāo)注位置 400開(kāi)頭電話怎樣申請(qǐng) 官渡電銷(xiāo)外呼管理系統(tǒng)怎么收費(fèi) 地圖區(qū)域圖標(biāo)注后導(dǎo)出 赤峰電銷(xiāo) 杭州人工智能電銷(xiāo)機(jī)器人費(fèi)用 谷歌美發(fā)店地圖標(biāo)注 貴州電話智能外呼系統(tǒng)

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

實(shí)現(xiàn)代碼

看下實(shí)現(xiàn)的簡(jiǎ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會(huì)302跳轉(zhuǎn)到https://www.qq.com。我們使用curl可以看到使用302的跳轉(zhuǎn)。

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

http請(qǐng)求為什么可以做到多次redirect

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

607 err = c.checkRedirect(req, reqs)

代碼的上下文,可以看出 req是將要請(qǐng)求的request,reqs已經(jīng)請(qǐng)求過(guò)的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,如果沒(méi)有設(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)就拋出錯(cuò)誤結(jié)束這次請(qǐng)求了。

大體上流程已經(jīng)搞明白。只要設(shè)置checkRedirect返回error,理論上就能實(shí)現(xiàn)只請(qǐ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 fmt.Errorf("first response")
 }
 response, _ := client.Do(reqest)
 fmt.Println(response.StatusCode)
}

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

基本實(shí)現(xiàn)了。

其實(shí),在CheckRedirect方法上面有一行說(shuō)明,

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ā)送下一個(gè)請(qǐng)求,并且返回最近的響應(yīng)且其主體未關(guān)閉。

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

最終的代碼實(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開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題的文章就介紹到這了,更多相關(guān)golang http請(qǐng)求redirect內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • golang http請(qǐng)求封裝代碼
  • Golang發(fā)送http GET請(qǐng)求的示例代碼
  • golang使用http client發(fā)起get和post請(qǐng)求示例
  • 詳解golang中發(fā)送http請(qǐng)求的幾種常見(jiàn)情況
  • golang編程入門(mén)之http請(qǐng)求天氣實(shí)例
  • golang高性能的http請(qǐng)求 fasthttp詳解

標(biāo)簽:宜春 武漢 泰安 鷹潭 松原 保定 河池 黔西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解golang開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題》,本文關(guān)鍵詞  詳解,golang,開(kāi)發(fā),中,http,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解golang開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于詳解golang開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    龙江县| 三明市| 怀安县| 周宁县| 常德市| 确山县| 石渠县| 贺兰县| 蒙阴县| 玉龙| 洪湖市| 射洪县| 吕梁市| 贺兰县| 卓尼县| 威海市| 新邵县| 鸡东县| 永平县| 饶河县| 伊春市| 平邑县| 北碚区| 盱眙县| 综艺| 特克斯县| 成安县| 连云港市| 广德县| 油尖旺区| 临夏市| 马龙县| 贵阳市| 临澧县| 云霄县| 丰宁| 古丈县| 台中市| 泰州市| 全椒县| 宣威市|