处理HTTP请求超时的方法主要有以下几种:
-
设置
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)
}
-
使用
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)
}
-
自定义
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请求超时的几种常见方法。