假设一个网址有多个重定向,A-B-C-D,使用 http.Client.Get 最后取得的内容是网址D的内容,我们该手动处理包含重定向的网址。
默认请求
1
2
3
4
5
6
7
8
9
10
func main(){
resp, err := http.Get("http://www.golangnote.com/")
if err != nil {
fmt.Println(err)
}
fmt.Println("StatusCode:", resp.StatusCode)
fmt.Println(resp.Request.URL)
}
结果是显示重定向后网址的状态:
1
2
StatusCode: 200
https://golangnote.com/
禁用重定向
自定义 CheckRedirect
函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func main(){
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
} }
resp, err := client.Get("http://www.golangnote.com")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("StatusCode:", resp.StatusCode)
fmt.Println(resp.Request.URL)
}
输出:
1
2
StatusCode: 301
http://www.golangnote.com
跟踪重定向地址
写一个 for
循环跟踪重定网址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func main() {
myURL := "http://www.golangnote.com"
nextURL := myURL
var i int
for i < 100 {
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
}}
resp, err := client.Get(nextURL)
//resp, err := client.Head(nextURL)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("StatusCode:", resp.StatusCode)
fmt.Println(resp.Request.URL)
if resp.StatusCode == 200 {
fmt.Println("Done!")
break
} else {
nextURL = resp.Header.Get("Location")
i += 1
}
}
}
输出
1
2
3
4
5
6
7
StatusCode: 301
http://www.golangnote.com
StatusCode: 301
https://www.golangnote.com/
StatusCode: 405
https://golangnote.com/
Head "": unsupported protocol scheme ""
如果单纯的想跟踪重定向网址,可把 client.Get
改为 client.Head
,状态码添加一个判断 resp.StatusCode == 405
。
本文网址: https://golangnote.com/topic/306.html 转摘请注明来源