Cuối cùng, tôi đã kết thúc bằng chức năng tiện ích này cho tất cả các yêu cầu yêu cầu hết thời gian chờ. Vì một số lý do mã @sparrovv đã hoạt động.
// reqType is one of HTTP request strings (GET, POST, PUT, DELETE, etc.)
func DoRequest(reqType string, url string, headers map[string]string, data []byte, timeoutSeconds int) (int, []byte, map[string][]string, error) {
var reader io.Reader
if data != nil && len(data) > 0 {
reader = bytes.NewReader(data)
}
req, err := http.NewRequest(reqType, url, reader)
if err != nil {
return 0, nil, nil, err
}
// I strongly advise setting user agent as some servers ignore request without it
req.Header.Set("User-Agent", "YourUserAgentString")
if headers != nil {
for k, v := range headers {
req.Header.Set(k, v)
}
}
var (
statusCode int
body []byte
timeout time.Duration
ctx context.Context
cancel context.CancelFunc
header map[string][]string
)
timeout = time.Duration(time.Duration(timeoutSeconds) * time.Second)
ctx, cancel = context.WithTimeout(context.Background(), timeout)
defer cancel()
err = httpDo(ctx, req, func(resp *http.Response, err error) error {
if err != nil {
return err
}
defer resp.Body.Close()
body, _ = ioutil.ReadAll(resp.Body)
statusCode = resp.StatusCode
header = resp.Header
return nil
})
return statusCode, body, header, err
}
Chỉ cần cho các bạn biết rằng tôi thấy cách này thuận tiện hơn (thời gian chờ quay số không hoạt động tốt nếu có sự cố mạng, ít nhất là đối với tôi): https://blog.golang.org/context – Audrius
@Audrius Bất kỳ ý tưởng nào tại sao thời gian chờ quay số không hoạt động khi có sự cố mạng? Tôi nghĩ tôi cũng thấy điều tương tự. Tôi nghĩ đó là những gì DialTimeout đã cho?!?! – Jordan
@Jordan Khó nói là tôi đã không đi sâu vào mã thư viện. Tôi đã đăng giải pháp của tôi dưới đây. Tôi đang sử dụng nó trong sản xuất trong một thời gian dài và cho đến nay nó "chỉ hoạt động" (tm). – Audrius