超时设置connect和read超时

wen java案例 1

本文目录导读:

超时设置connect和read超时

  1. Python (requests 库)
  2. Go (net/http)
  3. Node.js (axios)
  4. Java (OkHttp)
  5. curl 命令行
  6. 最佳实践建议
  7. 超时后的错误处理

针对 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 握手延迟等),请提供更多上下文,我可以进一步细化建议。

抱歉,评论功能暂时关闭!