请求超时怎么解决

处理HTTP请求超时的方法主要有以下几种:

  1. 设置http.Client的超时属性
import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    // 创建一个带有超时的 HTTP 客户端
    client := &http.Client{
        Timeout: 5 * time.Second, // 设置请求超时时间为 5 秒
    }
    // 发起 HTTP GET 请求
    resp, err := client.Get("https://example.com")
    if err != nil {
        fmt.Println("Request failed:", err)
        return
    }
    defer resp.Body.Close()
    fmt.Println("Response status:", resp.Status)
}
  1. 使用context.Context进行超时控制
import (
    "context"
    "fmt"
    "net/http"
    "time"
)

func main() {
    // 创建一个带有超时的上下文
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 发起 HTTP GET 请求
    req, err := http.NewRequestWithContext(ctx, "GET", "https://example.com", nil)
    if err != nil {
        fmt.Println("Request failed:", err)
        return
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Request failed:", err)
        return
    }
    defer resp.Body.Close()
    fmt.Println("Response status:", resp.Status)
}
  1. 自定义http.Transport
import (
    "fmt"
    "net"
    "net/http"
    "time"
)

func main() {
    // 自定义Transport,配置连接超时和读写超时
    transport := &http.Transport{
        // 设置连接超时
        DialContext: (&net.Dialer{
            Timeout: 5 * time.Second, // 最大连接时间
        }).DialContext,
        // TLS handshake超时
        TLSHandshakeTimeout: 5 * time.Second,
        // 等待响应头的超时时间
        ResponseHeaderTimeout: 5 * time.Second,
        // 100-continue状态码的超时时间
        ExpectContinueTimeout: 5 * time.Second,
    }

    // 使用自定义的Transport创建http.Client
    client := &http.Client{
        Transport: transport,
    }

    // 发起 HTTP GET 请求
    resp, err := client.Get("https://example.com")
    if err != nil {
        fmt.Println("Request failed:", err)
        return
    }
    defer resp.Body.Close()
    fmt.Println("Response status:", resp.Status)
}

以上是使用Go语言处理HTTP请求超时的几种常见方法。

Top