本文目录导读:

针对 HTTP 请求中的 连接超时(connect timeout) 和 读取超时(read timeout),不同编程语言和库的配置方法略有不同,以下是常见场景的配置示例和最佳实践:
Python (requests 库)
import requests
try:
response = requests.get(
'https://example.com',
timeout=(3.05, 27) # (connect_timeout, read_timeout) 单位秒
)
except requests.exceptions.ConnectTimeout:
print("连接超时")
except requests.exceptions.ReadTimeout:
print("读取超时")
注意:requests 默认没有超时,务必设置。connect 建议 3-5 秒,read 建议 10-30 秒。
Go (net/http)
package main
import (
"net/http"
"time"
)
func main() {
client := &http.Client{
Timeout: 30 * time.Second, // 整体超时(含连接+读取)
Transport: &http.Transport{
DialContext: (&net.Dialer{
Timeout: 5 * time.Second, // 连接超时
}).DialContext,
ResponseHeaderTimeout: 10 * time.Second, // 读取响应头超时
},
}
resp, err := client.Get("https://example.com")
}
说明:Go 没有独立的 read timeout,需通过 ResponseHeaderTimeout + Timeout 组合控制。
Node.js (axios)
const axios = require('axios');
axios.get('https://example.com', {
timeout: 5000, // 全局超时(连接+读取)毫秒
// 或更细粒度控制(需自定义 adapter,不常用)
})
.then(response => console.log(response))
.catch(error => {
if (error.code === 'ECONNABORTED') {
console.log('请求超时');
}
});
注意:axios 不区分 connect/read 超时,统一使用 timeout,若需区分,可用 http 模块自行实现。
Java (OkHttp)
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS) // 连接超时
.readTimeout(10, TimeUnit.SECONDS) // 读取超时
.writeTimeout(10, TimeUnit.SECONDS) // 写入超时(可选)
.build();
Request request = new Request.Builder()
.url("https://example.com")
.build();
try (Response response = client.newCall(request).execute()) {
// 处理响应
} catch (SocketTimeoutException e) {
System.out.println("超时:" + e.getMessage());
}
curl 命令行
# 连接超时 5秒,整体传输超时 30秒 curl --connect-timeout 5 --max-time 30 https://example.com
参数说明:
--connect-timeout:连接建立超时(秒)--max-time:整个请求允许的最大时间(含传输)
最佳实践建议
| 场景 | 连接超时 | 读取超时 | 说明 |
|---|---|---|---|
| 内部API调用 | 2-3s | 10-15s | 网络稳定,快速失败 |
| 外部第三方API | 5-10s | 30-60s | 网络不可控,适当放宽 |
| 大文件下载 | 5-10s | 不设或很大 | 改用流式读取,单独控制 |
| 高并发场景 | 1-2s | 5-10s | 避免线程/连接池耗尽 |
通用原则:
- 连接超时:不要太短(避免假失败),也不要太长(浪费资源),3-10 秒
- 读取超时:根据接口响应速度设定,10-30 秒
- 考虑重试机制(带退避策略),但避免幂等操作重复执行
超时后的错误处理
# Python 示例:区分超时类型
try:
resp = requests.get('...', timeout=(3, 10))
except requests.exceptions.ConnectTimeout:
# 可能是DNS问题/网络不通
logging.error("连接失败,请检查网络")
except requests.exceptions.ReadTimeout:
# 服务端响应慢或死锁
logging.warning("服务响应超时,考虑重试")
如果需要特定语言的完整示例或解决超时问题(如 DNS 慢、TCP 握手延迟等),请提供更多上下文,我可以进一步细化建议。