http.Client.Do停止执行,没有任何错误
我在http库中遇到了http.Client.Do停止执行,没有任何错误,http,go,proxy,Http,Go,Proxy,我在http库中遇到了Do函数的奇怪行为。 在我的程序中,我有一个工作人员在读一个频道。在每个消息上,工作者调用一个发出http请求的函数。以下是功能: func FetchUrlWithProxy(url string, proxy string) (*http.Response, error) { proxyUrl, err := urllib.Parse(proxy) // [1] if err != nil { return nil, err }
Do
函数的奇怪行为。
在我的程序中,我有一个工作人员在读一个频道。在每个消息上,工作者调用一个发出http请求的函数。以下是功能:
func FetchUrlWithProxy(url string, proxy string) (*http.Response, error) {
proxyUrl, err := urllib.Parse(proxy) // [1]
if err != nil {
return nil, err
}
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
log.Println("try ", url) // [2]
response, err := client.Do(request)
log.Println("done ", url) // [3]
if err != nil { // [4]
return nil, err
}
return response, nil
}
-它只是导入了这个名称[1]
-此行每次打印一次[2]
-这一行在打印时没有任何 错误/恐慌[3]
-因此,对返回值的检查是无用的。 执行没有达到这一点[4]
client
创建为client:=&http.client{}
,它就会工作。另一方面,代理并没有被破坏。我用curl
检查了它。怎么可能呢
如果您需要,我将提供任何其他信息。您的代码似乎正常工作-我怀疑您实际使用的代理发生了什么问题 代码:
package main
import (
"log"
"net/http"
urllib "net/url"
)
func FetchUrlWithProxy(url string, proxy string) (*http.Response, error) {
proxyUrl, err := urllib.Parse(proxy) // [1]
if err != nil {
return nil, err
}
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
log.Println("try ", url) // [2]
response, err := client.Do(request)
log.Println("done ", url) // [3]
if err != nil { // [4]
return nil, err
}
return response, nil
}
func main() {
res, err := FetchUrlWithProxy("https://www.google.com", "https://www.google.com")
log.Printf("R %v E %v\n", res, err)
}
以及输出:
➜ go run p.go
2015/07/20 21:44:45 try https://www.google.com
2015/07/20 21:44:46 done https://www.google.com
2015/07/20 21:44:46 <nil> Get https://www.google.com: unexpected EOF
➜ 快跑,快跑
2015/07/20 21:44:45试试看https://www.google.com
2015/07/20 21:44:46完成https://www.google.com
2015/07/20 21:44:46获取https://www.google.com: 意外EOF
您的代码似乎正常工作-我怀疑您实际使用的代理是否有问题
代码:
package main
import (
"log"
"net/http"
urllib "net/url"
)
func FetchUrlWithProxy(url string, proxy string) (*http.Response, error) {
proxyUrl, err := urllib.Parse(proxy) // [1]
if err != nil {
return nil, err
}
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
log.Println("try ", url) // [2]
response, err := client.Do(request)
log.Println("done ", url) // [3]
if err != nil { // [4]
return nil, err
}
return response, nil
}
func main() {
res, err := FetchUrlWithProxy("https://www.google.com", "https://www.google.com")
log.Printf("R %v E %v\n", res, err)
}
以及输出:
➜ go run p.go
2015/07/20 21:44:45 try https://www.google.com
2015/07/20 21:44:46 done https://www.google.com
2015/07/20 21:44:46 <nil> Get https://www.google.com: unexpected EOF
➜ 快跑,快跑
2015/07/20 21:44:45试试看https://www.google.com
2015/07/20 21:44:46完成https://www.google.com
2015/07/20 21:44:46获取https://www.google.com: 意外EOF
什么是恐慌输出?@thwd抱歉,但没有恐慌。它只是结束执行并获取新的url。这是不可能的。也许我误解了什么?尝试向http.Client添加超时选项。也许服务器只是没有响应WRT[4];检查错误从来都不是无用的,Do
可以返回错误。但是,由于您只需将错误传递给其他人,因此不需要任何if
;只需使用resp,err:=client.Do(req);log.Println(“完成”,url,错误);返回resp,err或者如果不需要日志记录,只需返回client.Do(req)。紧急输出是什么?@thwd抱歉,但没有紧急。它只是结束执行并获取新的url。这是不可能的。也许我误解了什么?尝试向http.Client添加超时选项。也许服务器只是没有响应WRT[4];检查错误从来都不是无用的,Do
可以返回错误。但是,由于您只需将错误传递给其他人,因此不需要任何if
;只需使用resp,err:=client.Do(req);log.Println(“完成”,url,错误);return resp,err或者如果不需要日志记录,只需返回client.Do(req)
。