在golang中,如何在一系列重定向后确定最终的URL?

时间:2013-05-28 05:23:20

标签: http go

所以,我正在使用net / http包。我正在获取一个我确定知道重定向的URL。在登陆最终URL之前,它甚至可能会重定向几次。重定向在幕后自动处理。

如果没有涉及在http.Client对象上设置CheckRedirect字段的hackish解决方法,有没有一种简单的方法可以找出最终的URL是什么?

我想我应该提一下,我认为我提出了一种解决方法,但它有点像hackish,因为它涉及使用全局变量并在自定义http.Client上设置CheckRedirect字段。

必须有一个更清洁的方法来做到这一点。我希望有这样的事情:

package main

import (
  "fmt"
  "log"
  "net/http"
)

func main() {
  // Try to GET some URL that redirects.  Could be 5 or 6 unseen redirections here.
  resp, err := http.Get("http://some-server.com/a/url/that/redirects.html")
  if err != nil {
    log.Fatalf("http.Get => %v", err.Error())
  }

  // Find out what URL we ended up at
  finalURL := magicFunctionThatTellsMeTheFinalURL(resp)

  fmt.Printf("The URL you ended up at is: %v", finalURL)
}

2 个答案:

答案 0 :(得分:65)

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    resp, err := http.Get("http://stackoverflow.com/q/16784419/727643")
    if err != nil {
        log.Fatalf("http.Get => %v", err.Error())
    }

    // Your magic function. The Request in the Response is the last URL the
    // client tried to access.
    finalURL := resp.Request.URL.String()

    fmt.Printf("The URL you ended up at is: %v\n", finalURL)
}

输出:

The URL you ended up at is: http://stackoverflow.com/questions/16784419/in-golang-how-to-determine-the-final-url-after-a-series-of-redirects

答案 1 :(得分:0)

我要添加一个注释,http.Head 方法应该足以检索最终 URL。从理论上讲,它应该比 http.Get 更快,因为服务器应该只发送一个标头:

resp, err := http.Head("http://stackoverflow.com/q/16784419/727643")
...
finalURL := resp.Request.URL.String()
...