HTTP超时时间设置

news/2024/10/18 8:29:08/

在进行超时时间设置之前我们需要了解一次http请求经历的过程

https://img-blog.csdnimg.cn/direct/a0aa0e62105d498e8860664ad2c19932.png" width="1200" />

  1. 浏览器进行DNS域名解析,得到对应的IP地址
  2. 根据这个IP,找到对应的服务器建立连接(三次握手)
  3. 建立TCP连接后发起HTTP请求(一个完整的http请求报文)
  4. 服务器响应HTTP请求,返回数据(服务器如何响应)
  5. 客户端对页面进行渲染呈现给用户
  6. 服务器关闭TCP连接(四次挥手)

在客户端和服务器之间通常有一层网关来负责路由和负载均衡:

https://img-blog.csdnimg.cn/direct/471ddfaa3ba84f71949a9cf40e1560c6.png" width="1200" />

DNS和TCP的超时时间通常由系统指定,DNS默认为5s,TCP建了超时默认为127s

所以下面从客户端、网关、服务端三个方面来讲解下HTTP请求的超时时间设置:

1、客户端设置

以JS为例

(1)使用XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/api', true);// 设置超时时间,单位是毫秒
xhr.timeout = 2000; // 2秒后超时// 定义超时处理逻辑
xhr.ontimeout = function () {console.error("The request for " + url + " timed out.");
};xhr.onload = function () {// 请求成功的处理逻辑if (xhr.status >= 200 && xhr.status < 300) {console.log('The request was successful!', xhr.responseText);} else {console.error('The request failed!', xhr.status);}
};xhr.onerror = function () {// 请求失败的处理逻辑console.error('The request encountered an error.');
};xhr.send();

(2)使用fetch

const url = 'http://example.com/api';// 设置超时时间
const timeout = 2000; // 2秒后超时// 创建一个超时的Promise
const timeoutPromise = new Promise((resolve, reject) => {setTimeout(() => {reject(new Error('Request timed out'));}, timeout);
});// 发起fetch请求
const fetchPromise = fetch(url);// 使用Promise.race同时执行请求和超时Promise,哪个先完成就处理哪个
Promise.race([fetchPromise, timeoutPromise]).then(response => {// 检查是否响应成功if (!response.ok) {throw new Error('Network response was not ok');}return response.text();}).then(data => {// 请求成功的处理逻辑console.log('The request was successful!', data);}).catch(error => {// 请求失败或超时的处理逻辑console.error('Failed!', error);});

其中timeout指整个请求过程的超时时间。 

2、网关超时时间设置

以nginx为例:

在nginx.conf配置文件中可以指定超时时间

server {location / {proxy_pass http://backend_server;proxy_connect_timeout 5s;proxy_read_timeout 10s;proxy_send_timeout 5s;}
}

其中:

  1. 连接超时(Connection Timeout): 这是指客户端尝试与服务器建立连接时的最大等待时间。如果在这个时间内没有建立连接(例如,服务器没有响应或者网络延迟很高),客户端就会放弃尝试并抛出一个超时异常。

  2. 读超时(Read Timeout): 读超时是指客户端与服务器连接成功后,等待服务器发送数据的最大时间。如果在这个时间内客户端没有收到任何数据,就会认为读取操作超时并抛出异常。这通常发生在服务器处理请求的时间过长,或者网络传输延迟导致数据包迟迟未到达客户端。

  3. 写超时(Write Timeout): 写超时是指在客户端尝试向服务器发送数据时的最大等待时间。如果客户端在这段时间内未能完成数据的发送,就会认为写操作超时。这可能是因为网络速度慢或者服务器处理写入请求的速度慢。

3、服务端超时时间设置

以Tomcat为例:

可以在server.xml 文件中指定服务器的超时时间,如下所示:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"readTimeout="15000"writeTimeout="15000" />

其中参数在上文已提及,不再赘述。


http://www.ppmy.cn/news/1461360.html

相关文章

PC小程序解密及反编译

一、小程序包解密 小程序原始加密包位置C:\Users\administrator\Documents\WeChat Files\Applet\wx234324324324 二、wxappUnpacker反编译 npm install./bingo D:\temp\小程序包解密\wxpack\wx234324324324.wxapkg 三、查看反编译后的文件

RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)

RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09; 文章目录 RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09;电路配置i2c1设备树创建驱动编写…

springMVC基础使用(示例)

maven依赖&#xff08;javax.servlet-api版本与spring-webmvc班恩要匹配不然会报java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRespons&#xff09;&#xff1a; <dependencies><dependency><groupId>javax.servlet</groupId><arti…

Android之实现《用户隐私政策》《服务条款》等文字点击可查看协议内容的超链接功能

一、步骤 1、控件 <TextViewandroid:id"id/tv_privacy"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"协议提示文字"android:textSize"12sp"android:textColor"color/color…

C++ 并发编程指南(11)原子操作 | 11.4、通过内存序实现顺序模型

文章目录 一、通过内存序实现顺序模型1、Relaxed Ordering2、Sequencial Consistent Ordering3、Acquire Release Ordering 前言 前文介绍了六种内存顺序&#xff0c;以及三种内存模型&#xff0c;本文通过代码示例讲解六种内存顺序使用方法&#xff0c;并实现相应的内存模型。…

【代码】Mysql 查询近一个月各类型设备新增数量

错误示例 SELECT COUNT(*) AS count, p.type, d.active_date FROM device d LEFT JOIN product p ON d.product_id p.pid WHERE MONTH (active_date) MONTH (CURRENT_DATE - INTERVAL 1 MONTH) AND YEAR (active_date) YEAR (CURRENT_DATE - INTERVAL 1 MONTH) group by p.…

(四十二)第 6 章 树和二叉树(树的二叉链表(孩子-兄弟)存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

高斯数据库创建存储过程

CREATE PROCEDURE 语法格式 CREATE [ OR REPLACE ] PROCEDURE procedure_name [ ( {[ argmode ] [ argname ] argtype [ { DEFAULT | : | } expression ]}[,…]) ] [ { IMMUTABLE | STABLE | VOLATILE } | { SHIPPABLE | NOT SHIPPABLE } | {PACKAGE} | [ NOT ] LEAKPROOF | {…