Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
http.Client.Do停止执行,没有任何错误_Http_Go_Proxy - Fatal编程技术网

http.Client.Do停止执行,没有任何错误

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 }

我在http库中遇到了
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)