【Golang】获取重定向后的最终 URL 【Go 1.20】
我想知道在 Go 语言(以下简称 golang)中,当请求URL时,最终的重定向URL是什么。
在GitHub的Gist中,仅指定gist ID进行请求,会被重定向到附带gist所有者用户名的URL。
- https://gist.github.com/42f5f23053ab59ca480f480b8d01e1fd
+ https://gist.github.com/KEINOS/42f5f23053ab59ca480f480b8d01e1fd
$ # リダイレクト先に /KEINOS が付加されている
$ curl -Ls -o /dev/null -w %{url_effective} https://gist.github.com//42f5f23053ab59ca480f480b8d01e1fd
https://gist.github.com/KEINOS/42f5f23053ab59ca480f480b8d01e1fd
除了内容是猴子之外,我仅仅想要用golang获取这个URL。
由于在搜索“golang”重定向获取最终URL时,发现源代码无法运行或者出现不接受HEAD方法的错误,这仅仅是为了提升自己在搜索引擎上的可见度的。
简而言之(今北产业)
import (
"net/http"
"time"
)
// FindRedirectURL はリダイレクトされた最終的な URL を返します。15 秒経過してもレスポンスが
// ない場合はタイムアウトでエラーを返します。
func FindRedirectURL(url string) (string, error) {
client := &http.Client{
Timeout: 15 * time.Second,
}
resp, err := client.Get(url)
if err != nil {
return "", err
}
finalURL := resp.Request.URL.String()
return finalURL, nil
}
import (
"net/http"
"time"
)
// FindRedirectURL はリダイレクトされた最終的な URL を返します。15 秒経過してもレスポンスが
// ない場合はタイムアウトでエラーを返します。
func FindRedirectURL(url string) (string, error) {
client := &http.Client{
Timeout: 15 * time.Second,
}
- resp, err := client.Get(url)
+ resp, err := client.Head(url)
if err != nil {
return "", err
}
finalURL := resp.Request.URL.String()
return finalURL, nil
}
package main
import (
"fmt"
"log"
"net/http"
"time"
)
func FindRedirectURL(url string) (string, error) {
client := &http.Client{
Timeout: 15 * time.Second,
}
resp, err := client.Head(url)
if err != nil {
return "", err
}
finalURL := resp.Request.URL.String()
return finalURL, nil
}
func main() {
urlOriginal := "https://gist.github.com/42f5f23053ab59ca480f480b8d01e1fd"
fmt.Println("Original:", urlOriginal)
urlRedirect, err := FindRedirectURL(urlOriginal)
if err != nil {
log.Fatal(err)
}
fmt.Println("Redirect:", urlRedirect)
// Output:
// Original: https://gist.github.com/42f5f23053ab59ca480f480b8d01e1fd
// Redirect: https://gist.github.com/KEINOS/42f5f23053ab59ca480f480b8d01e1fd
}
オンラインで動作を見る @ paiza.IO
$ date
2023年 5月15日 月曜日 12時26分29秒 JST
$ go version
go version go1.20.4 darwin/amd64
$ sw_vers
ProductName: macOS
ProductVersion: 12.6.5
BuildVersion: 21G531
-
- 参考文献:
Overview | http | net @ pkg.go.dev
「Go net/http タイムアウト」の完全ガイド @ blog.cloudflare.com
In golang, how to determine the final URL after a series of redirects? @ StackOverflow
Get final URL after curl is redirected @ StackOverflow