gpt4 book ai didi

go - 设置内置 HTTP 请求超时的最佳方式

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:20 28 4
gpt4 key购买 nike

内置 http NewRequest 上设置超时的最佳方法是什么?目前,我正在使用覆盖整个交换的 http.Client.Timeout,但是是否有更好的东西,例如 context.WithDeadlinecontext.WithTimeout。如果是,它是如何工作的,我如何为 http.NewRequest 设置一个 context.WithDeadline 解决方案?

这是我目前的解决方案:

func (c *Client) post(resource string, data url.Values, timeout time.Duration) ([]byte, error) {
url := c.getURL(resource)
client := &http.Client{
Timeout: timeout * time.Millisecond,
}
req, err := http.NewRequest("POST", url, strings.NewReader(data.Encode()))
if err != nil {
return nil, err
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)
if err != nil {
return nil, err
}
return ioutil.ReadAll(resp.Body)
}

最佳答案

从 context.WithDeadline 获取新的上下文。参见 documentation .WithTimeout 只返回 WithDeadline(parent, time.Now().Add(timeout))。

package main

import (
"context"
"io"
"log"
"net/http"
"os"
"time"
)

func getContent(ctx context.Context) {
req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithDeadline(ctx, time.Now().Add(3 * time.Second))
defer cancel()

req.WithContext(ctx)

resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
}

func main() {
ctx := context.Background()
getContent(ctx)
}

如果你想在 main 上取消触发:

func main() {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)

sc := make(chan os.Signal, 1)
signal.Notify(sc, os.Interrupt)
go func(){
<-sc
cancel()
}()

getContent(ctx)
}

关于go - 设置内置 HTTP 请求超时的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44911726/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com