Golang에서 http.Get () 요청에 대한 시간 제한을 설정하는 방법은 무엇입니까?
Go에서 URL 가져 오기 프로그램을 만들고 있으며 가져올 URL 목록이 있습니다. http.Get()
각 URL에 요청을 보내고 응답을받습니다.
resp,fetch_err := http.Get(url)
각 Get 요청에 대해 사용자 지정 시간 제한을 설정하려면 어떻게해야합니까? (기본 시간은 매우 길기 때문에 가져 오기 프로그램이 매우 느려집니다.) 내 가져 오기 프로그램이 약 40-45 초의 시간 제한을 갖기를 원합니다. 그 후 "요청 시간 초과"를 반환하고 다음 URL로 이동해야합니다.
이것을 어떻게 할 수 있습니까?
분명히 Go 1.3 http.Client 에는 Timeout 필드가 있습니다.
client := http.Client{
Timeout: 5 * time.Second,
}
client.Get(url)
그것은 나를 위해 트릭을 수행했습니다.
DialTimeout 을 감싸는 사용자 지정 Dial 기능을 사용하는 자체 Transport로 자체 클라이언트 를 설정해야합니다 .
(완전히 테스트되지 않은 ) 다음 과 같은 것 :
var timeout = time.Duration(2 * time.Second)
func dialTimeout(network, addr string) (net.Conn, error) {
return net.DialTimeout(network, addr, timeout)
}
func main() {
transport := http.Transport{
Dial: dialTimeout,
}
client := http.Client{
Transport: &transport,
}
resp, err := client.Get("http://some.url")
}
Volker의 답변에 추가하려면 연결 제한 시간 외에도 읽기 / 쓰기 제한 시간을 설정하려면 다음과 같이 할 수 있습니다.
package httpclient
import (
"net"
"net/http"
"time"
)
func TimeoutDialer(cTimeout time.Duration, rwTimeout time.Duration) func(net, addr string) (c net.Conn, err error) {
return func(netw, addr string) (net.Conn, error) {
conn, err := net.DialTimeout(netw, addr, cTimeout)
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(rwTimeout))
return conn, nil
}
}
func NewTimeoutClient(connectTimeout time.Duration, readWriteTimeout time.Duration) *http.Client {
return &http.Client{
Transport: &http.Transport{
Dial: TimeoutDialer(connectTimeout, readWriteTimeout),
},
}
}
이 코드는 테스트되었으며 프로덕션에서 작동 중입니다. 테스트가 포함 된 전체 요지는 여기 https://gist.github.com/dmichael/5710968 에서 확인할 수 있습니다.
conn.SetDeadline
향후 지점을 참조하는 각 요청에 대해 새 클라이언트를 만들어야합니다.time.Now()
요청별로 수행하려면 간결성을 위해 오류 처리가 무시됩니다.
ctx, cncl := context.WithTimeout(context.Background(), time.Second*3)
defer cncl()
req, _ := http.NewRequest(http.MethodGet, "https://google.com", nil)
resp, _ := http.DefaultClient.Do(req.WithContext(ctx))
빠르고 더러운 방법 :
http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45
이것은 조정없이 전역 상태를 변경하는 것입니다. 그러나 URL 가져 오기 프로그램에는 괜찮을 수 있습니다. 그렇지 않으면의 비공개 인스턴스를 만듭니다 http.RoundTripper
.
var myTransport http.RoundTripper = &http.Transport{
Proxy: http.ProxyFromEnvironment,
ResponseHeaderTimeout: time.Second * 45,
}
var myClient = &http.Client{Transport: myTransport}
resp, err := myClient.Get(url)
...
위의 내용은 테스트되지 않았습니다.
You may use https://github.com/franela/goreq which handles timeouts in a fashion and simple way.
timeout := time.Duration(5 * time.Second)
transport := &http.Transport{Proxy: http.ProxyURL(proxyUrl), ResponseHeaderTimeout:timeout}
This may help, but notice that ResponseHeaderTimeout
starts only after the connection is established.
참고URL : https://stackoverflow.com/questions/16895294/how-to-set-timeout-for-http-get-requests-in-golang
'developer tip' 카테고리의 다른 글
Nested Scrollview 스크롤 내부의 Recyclerview가 일반 Recyclerview 또는 Nested Scrollview처럼 빠르게 스크롤되지 않습니다. (0) | 2020.09.06 |
---|---|
IntelliJ Gradle 플러그인 : 제공된 javaHome이 유효하지 않은 것 같습니다. (0) | 2020.09.06 |
Android에서 둥근 모서리로 사용자 지정 대화 상자를 만드는 방법 (0) | 2020.09.06 |
Nib에서 재사용 가능한 UITableViewCell로드 (0) | 2020.09.06 |
Spring XML에서 기본 속성 값을 지정하는 방법이 있습니까? (0) | 2020.09.06 |