【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

广告
将在 10 秒后关闭
bannerAds