探索Apache HttpClient超时时间如何设定?
off999 2025-03-23 22:30 27 浏览 0 评论
大家好,我是哪吒。
最近在项目遇到了通过HTTP请求,调用第三方接口的问题。
一、Apache HttpClient模拟POST请求,调用第三方接口
Apache HttpClient是一个流行的Java库,用于发送HTTP请求。
我们可以使用该库来模拟POST请求。
1、发起POST请求:
@Controller
@RequestMapping("/client")
public class TestController {
private static final String url = "http://127.0.0.1:8080/MyProject/nezha/getUser";
@RequestMapping(value = "/getUser", method = RequestMethod.POST)
@ResponseBody
public User getUser(@RequestBody User user) {
System.out.println("请求参数:"+user);
String json = JSON.toJSONString(user);
String userRet = HttpUtil.sendHttpPost(url, json);
User ret = JSON.toJavaObject(JSONObject.parseObject(userRet), User.class);
System.out.println("HttpPost方式发送POST请求:"+ret);
return ret;
}
}2、模拟服务端
@Controller
@RequestMapping("/server")
public class PostServerController {
@RequestMapping(value = "/getUser", method = RequestMethod.POST)
@ResponseBody
public User getUser(@RequestBody User user) {
user.setInfo("getUser,我 OK 啦");
System.out.println(user);
return user;
}
}3、通过postman测试一下
4、Apache HttpClient
public class HttpUtil {
/**
* HttpPost方式
* 发送POST请求
*/
public static String sendHttpPost(String url, String data) {
String response = null;
try {
CloseableHttpClient httpclient = null;
CloseableHttpResponse httpresponse = null;
try {
httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000) //连接超时时间
.setSocketTimeout(5000) //读取数据超时时间
.build();
httppost.setConfig(requestConfig);
StringEntity stringentity = new StringEntity(data, ContentType.create("application/json", "UTF-8"));
httppost.setEntity(stringentity);
httpresponse = httpclient.execute(httppost);
response = EntityUtils.toString(httpresponse.getEntity());
} finally {
if (httpclient != null) {
httpclient.close();
}
if (httpresponse != null) {
httpresponse.close();
}
}
} catch (Exception e) {
return null;
}
return response;
}
}大家注意到了吗?HttpClient需要配置一个连接超时时间和读取数据超时时间。在配置的时候,我也是根据以往的经验,大概的配置了一下,这个数值怎么界定,也是没有一个准确的说法。
二、HTTP超时时间
1、众所周知,HTTP使用的是TCP/IP 协议。
TCP/IP协议是能够实现多个不同网络间信息传输的协议簇,它包括以下几个主要的协议:
- 传输控制协议(TCP):是一种面向连接的协议,它提供了一种可靠的数据传输服务,通过序列号、确认号、重传和流量控制等机制来实现数据的传输。
- 互联网协议(IP):是一种无连接协议,它负责将数据分组在网络上进行传输。IP协议通过将数据分组封装在一个个数据包中,并在每个数据包中包含源地址和目的地址,来实现数据在网络上的传输。
- 用户数据报协议(UDP):是一种无连接协议,它提供了一种简单的数据传输服务,但是它并不能保证数据的可靠性和顺序。UDP通常用于一些不需要可靠传输的场景,例如音频和视频流传输等。
- 地址解析协议(ARP):该协议用于将网络层的IP地址解析为数据链路层的MAC地址。
- 反向地址解析协议(RARP):该协议用于将数据链路层的MAC地址解析为网络层的IP地址。
- 动态主机配置协议(DHCP):该协议用于动态地分配IP地址和其他网络配置参数。
- 网络时间协议(NTP):该协议用于在网络上同步时间。
- 简单邮件传输协议(SMTP):该协议用于在网络上传输电子邮件。
- 文件传输协议(FTP):该协议用于在网络上进行文件传输。
除了上述协议外,TCP/IP协议簇还包括其他一些协议,如Telnet、SNMP、HTTP、HTTPS等。这些协议在不同的应用场景中发挥着重要的作用。
2、TCP/IP超时时间设置
TCP/IP协议中的超时时间是指网络在传输数据时,等待数据包返回确认信息的时间。具体来说,当一个数据包被发送到网络中后,发送方会等待接收方的确认信息,以确定数据包是否已经被成功接收。如果超过了一定的时间,还没有收到确认信息,那么发送方就会认为数据包已经丢失,然后会重新发送数据包。这个一定的时间就是TCP/IP协议中的超时时间。
TCP/IP协议中的超时时间可以通过“重试次数”和“初始超时时间”来设置。重试次数是指发送方在未收到确认信息时,重新发送数据包的次数;初始超时时间是指发送方等待确认信息的初始时间。这两个参数通常可以根据具体情况进行调整,以满足不同的网络传输需求。
一般来说,TCP/IP协议中的超时时间应该在几百毫秒到几秒之间。具体的时间取决于网络状况、数据包的大小以及数据传输的距离等因素。如果超时时间设置得太短,可能会导致不必要的重试次数,浪费网络资源;如果超时时间设置得太长,可能会导致传输延迟,影响网络性能。因此,在设置TCP/IP协议中的超时时间时,需要根据具体情况进行综合考虑。
3、HTTP连接超时时间如何设置?
一般来说,TCP 三次握手建立连接需要的时间非常短,一般都在毫秒级。
如果十几秒、甚至几十秒都无法连接,很可能是网络问题或者防火墙问题,大概率是永远无法连接了。
因此连接超时时间一般不会设置的太大,2-6秒即可。
需要注意的是,现在的程序开发中,一般都是使用Nginx 的反向代理来负载均衡,客户端连接的其实是 Nginx,而不是服务端。
4、HTTP读取超时时间如何设置?
(1)先理解一下什么是读取超时?
一般来说,连接超时,指的就是网络连接超时。
那么读取超时呢?
在我看来,读取超时包括了Http请求的网络时间+服务端接口处理业务逻辑的时间+数据返回的网络时间。
因此,如果发生了读取超时,是无法判断是网络超时还是接口执行超时的。
(2)读取超时时间越大越好吗?
很多小伙伴会有这样的想法,那我将读取超时时间设置的足够大,足够你网络+业务执行的时间了,不就万事OK了嘛!
真的是这样吗?
一般情况下,Http请求都是同步调用,如果设置的足够大,往往会影响客户端程序的执行效率,如果是高并发场景,后果不堪设想,异步的时候可以,这也是异步的应用场景之一。
(3)读取超时时间大于接口的执行时间,第三方接口执行会中断吗?
下面将读取超时时间设置为5秒,为了模拟效果,将第三方接口的执行时间设置为10秒。
也就是说读取超时时间大于接口的执行时间,没等执行完呢,因为读取超时,Http请求断开了。
此时,第三方接口执行会中断吗?
调用 client 接口后,从日志中可以看到,客户端 5 秒后出现了 SocketTimeoutException,原因是读取超时,第三方接口却丝毫没受影响在 5 秒后执行完成。
众所周知,Tomcat的web服务器是将请求提交到线程池执行的,只要服务端收到了请求,网络层的超时和断开不会影响服务端的执行。
说了这么多,HTTP读取超时时间如何设置?
就像一开始的时候说的,根据程序的实际情况和性能要求进行设置,没有一个明确的标准。
就像《夜行者》中所说,这个世界本就没有什么白与黑之分。
很多事情都没有一个明确的答案。
相关推荐
- 手机163邮箱app下载(163邮箱下载手机版官网 app)
-
163邮箱登录首页入口为http://mail.163.com/网易163免费邮箱--中文邮箱第一品牌.容量自动翻倍,支持50兆附件,免费开通手机号码邮箱赠送3G超大附件服务.支持各种客户端软件收发,...
-
- win10此电脑怎么放在桌面上(wind10此电脑放桌面)
-
步骤/方式1右键单击桌面空白处,点击个性化。步骤/方式2点击更改桌面图标。步骤/方式3把计算机勾选上。步骤/方式4即可把此电脑图标显示在桌面上。...
-
2025-11-08 14:03 off999
- 电脑配置怎么看在电脑上(电脑配置在电脑里怎么看)
-
查看电脑配置的方法有多种,以下是一些常见的方法:直接查看:在电脑桌面或操作系统中,找到“我的电脑”或“此电脑”,右键点击并选择“属性”,即可查看电脑的基本配置信息,包括CPU型号、内存大小、硬盘类型和...
- 电脑开机反复启动不起来(电脑开机反复重启开不了机怎么办)
-
1、先关闭主机总电源,电脑先关机吧,打开机箱,将内存条插槽两边的白色专卡口轻向下按,使内存条属弹出插槽。?2、取出内存条后,用干净的橡皮擦擦拭金手指或者用吹风机吹一吹。?3、然后将内存条对准插槽的卡口...
- win10家庭版转专业版密钥(windows10家庭版升级到专业版密钥)
-
家庭版升级专业版密钥,需要付费购买获取不可以,家庭版密钥只是电脑还原时有效,重装系统就没有用了,可以看下面的方法。我是在淘宝买过几个不同系统的密钥都很好用,1-10元都买过,您进入搜索您需要系统的密钥...
- 安卓镜像下载(安卓镜像下载官网)
-
vmwareiso镜像文件可以从VMware官网下载。具体的下载步骤如下:1.打开VMware官网,进入产品下载页面。2.在产品下载页面,选择需要下载的VMware产品,比如VMwareWork...
- 哪个品牌u盘最可靠(哪个品牌的u盘好用)
-
十大耐用云U盘排行分别是:第一名闪迪第二名雷克沙第三名金士顿第四名三星第五名美商海盗船第六名东芝第七名惠普第八名威刚第九名台电第十名朗科。 质量最稳定u盘是金士顿:全球存储产品领导品牌,全球规模最大...
- windows11系统怎么样(win11使用怎么样)
-
免激活的WindowS11系统很好用,所谓的免激活,并不是不激活,而是在安装的过程当中已经进行了激活,如果激活码是正规渠道获得的,那么就可以被微软所认可,这样的系统在今后的升级或者是打补丁的过程当中...
- 打印机如何网络共享打印(打印机网络共享打印怎么设置)
-
想要建立打印机共享使用的方法如下1右击【计算机】选择【管理】,在弹出的【计算机管理】窗口中:系统工具->本地用户和组->用户,在右边找到【Guest】双击进去,把账户已禁用的勾选去掉。2回...
- 联想售后维修服务地址(联想售后维修 电话)
-
官方网站:http://www.lenovo.com.cn/作为全球电脑市场的领导企业,联想从事开发、制造并销售可靠的、安全易用的技术产品及优质专业的服务,帮助全球客户和合作伙伴取得成功。联想公司主要...
- 华硕系统(华硕系统恢复)
-
华硕电脑安装的是微软公司的windows系统。一般的华硕电脑出厂的时候安装的都是微软的操作系统,不会安装安卓或者苹果的操作系统。安卓的操作系统一般都是安装在手机上面的,苹果的操作系统都是安装在苹果手机...
- wifi强力破解软件排名(wife强力破解软件)
-
目前我还沒发现有可以破解WiFi密码的软件,有可能有,但这是违法的,所以开发者不可能在网上发布的。有很多人说万能钥匙,其实万能钥匙不是破解WiFi密码,而是密码共享,也就是说一台手机上安装万能钥匙,有...
- 电脑回收站怎么找出来(电脑回收站到哪里找)
-
1、打开电脑来到桌面,在空白的地方单击右键,在跳出来的属性中选择个性化。2、点击更改桌面图片,然后会跳出一个桌面图标设置,对桌面上固有图标的更改。3、在桌面图标设置中你可以看到回收站前面未勾选,勾选了...
- windows xp电脑公司特别版(正版windows xp)
-
1、请看下你的游戏说明,是否需要最新版本的显卡驱动支持,如果需要,请将你的显卡驱动升级到最新版。另外,Win7系统内置了很多显卡驱动程序,所以很多计算机在安装完操作系统后都不需要再安装显卡驱动,但是还...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
慕ke 前端工程师2024「完整」
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
