主页 > 知识库 > 详解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的问题的相关信息资讯供网民参考!
  • 推荐文章