详解详解golang开发中开发中http请求请求redirect的问题的问题
这两天在开发项目的时候遇到了一个问题,请求了一个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 {
评论0
最新资源