探索Apache HttpClient超时时间如何设定?

news2025/5/25 4:39:23

在这里插入图片描述

目录

    • 一、Apache HttpClient模拟POST请求,调用第三方接口
      • 1、发起POST请求:
      • 2、模拟服务端
      • 3、通过postman测试一下
      • 4、Apache HttpClient
    • 二、HTTP超时时间
      • 1、众所周知,HTTP使用的是TCP/IP 协议。
      • 2、TCP/IP超时时间设置
      • 3、HTTP连接超时时间如何设置?
      • 4、HTTP读取超时时间如何设置?

大家好,我是哪吒。

最近在项目遇到了通过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协议是能够实现多个不同网络间信息传输的协议簇,它包括以下几个主要的协议:

  1. 传输控制协议(TCP):是一种面向连接的协议,它提供了一种可靠的数据传输服务,通过序列号、确认号、重传和流量控制等机制来实现数据的传输。
  2. 互联网协议(IP):是一种无连接协议,它负责将数据分组在网络上进行传输。IP协议通过将数据分组封装在一个个数据包中,并在每个数据包中包含源地址和目的地址,来实现数据在网络上的传输。
  3. 用户数据报协议(UDP):是一种无连接协议,它提供了一种简单的数据传输服务,但是它并不能保证数据的可靠性和顺序。UDP通常用于一些不需要可靠传输的场景,例如音频和视频流传输等。
  4. 地址解析协议(ARP):该协议用于将网络层的IP地址解析为数据链路层的MAC地址。
  5. 反向地址解析协议(RARP):该协议用于将数据链路层的MAC地址解析为网络层的IP地址。
  6. 动态主机配置协议(DHCP):该协议用于动态地分配IP地址和其他网络配置参数。
  7. 网络时间协议(NTP):该协议用于在网络上同步时间。
  8. 简单邮件传输协议(SMTP):该协议用于在网络上传输电子邮件。
  9. 文件传输协议(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读取超时时间如何设置?

就像一开始的时候说的,根据程序的实际情况和性能要求进行设置,没有一个明确的标准。

就像《夜行者》中所说,这个世界本就没有什么白与黑之分。

很多事情都没有一个明确的答案。

上一篇:一个关于 i++ 和 ++i 的面试题打趴了所有人

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记Kubernetes核心技术-之Controller

2、Controller 2.1、概述 在集群上管理和运行容器的对象,控制器(也称为:工作负载),Controller实际存在的,Pod是抽象的; 2.2、Pod和Controller关系 Pod是通过Controller实现应用运维,比如:弹…

前馈神经网络处理二分类任务

此文建议看完基础篇再来,废话不多说,进入正题 目录 1.神经元 1.1 活性值 1.2 激活函数 1.2.1 Sigmoid函数 1.2.2 Relu函数 2.基于前馈神经网络的二分类任务 2.1 数据集的构建 2.2 模型的构建 2.2.1 线性层算子 2.2.2 Logistic算子 2.2.3 层的串行组合…

FL Studio 21.2.0.3842中文破解版发布啦,支持 Cloud 在线采样库和 AI 音乐制作功能

好消息!FL Studio 21.2 在 10 月 26 日正式发布啦,它新增了 FL Cloud 在线采样库和 AI 音乐制作功能,还提供音乐分发到 Spotify、Apple Music 等主要音乐平台的服务。此外,还有新的音频分离功能、自定义波形颜色和新的合成器 Kepl…

改进YOLOv3!IA-YOLO:恶劣天气下的目标检测

恶劣天气条件下从低质量图像中定位目标还是极具挑战性的任务。现有的方法要么难以平衡图像增强和目标检测任务,要么往往忽略有利于检测的潜在信息。本文提出了一种新的图像自适应YOLO (IA-YOLO)框架,可以对每张图像进行自适应增强,以提高检测…

Windows一键添加命名后缀(文件)

温馨提示:使用前建议先进行测试和原文件备份,避免引起不必要的损失。 (一)需求描述 之前老板让我给大量文件添加命名前缀,如今为了防患于未然,我决定把添加命名后缀的功能也实现一下,虽然这与添…

EASYX键盘交互

eg1:使用键盘的上下左右按钮控制小球的上下左右移动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <conio.h> #define PI 3.14int main() {// 键盘交互initgraph(800, 600);setorigin(400, 300);set…

Linux网卡

网卡 网卡&#xff08;Network Interface Card&#xff0c;NIC&#xff09;是一种计算机硬件设备&#xff0c;也称为网络适配器或网络接口控制器。一个网卡就是一个接口 网卡组成和工作原理参考https://blog.csdn.net/tao546377318/article/details/51602298 每个网卡都拥有唯…

Mac删除照片快捷键ctrl加什么 Mac电脑如何批量删除照片

Mac电脑是很多人喜欢使用的电脑&#xff0c;它有着优美的设计、高效的性能和丰富的功能。如果你的Mac电脑上存储了很多不需要的照片&#xff0c;那么你可能会想要删除它们&#xff0c;以节省空间和提高速度。那么&#xff0c;Mac删除照片快捷键ctrl加什么呢&#xff1f;Mac电脑…

双目视觉计算三维坐标

一、原理 双目视觉的基本原理&#xff0c;以及公式推导&#xff0c;我参考的b站上的视频&#xff0c;链接如下&#xff1a; 2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q34y1n7ot/?p2&spm_id_from333.…

链表加法与节点交换:数据结构的基础技能

目录 两两交换链表中的节点单链表加一链表加法使用栈实现使用链表反转实现 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点…

13年测试老鸟,性能压测-死锁定位分析/内存溢出实例(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 死锁问题定位与分…

0029Java程序设计-家政服务平台管理系统

文章目录 摘要目录系统设计开发环境 摘要 本文首先研究并介绍国内外目前的背景和现状&#xff0c;在此基础上给出论文的主要研究内容&#xff0c;其次&#xff0c;对家政服务平台管理系统的需求进行了分析。再次&#xff0c;对家政服务平台管理系统进行了总体设计&#xff0c;…

虚拟机安装详细步骤(简单版)

虚拟机作为工作以及学习的工具&#xff0c;是很多人必不可少的一款软件&#xff0c;今天就给大家讲一讲如何将虚拟机成功安装上系统&#xff0c;其中呢也将部分问题在文章中表达&#xff0c;因为很多人表示出现了一些问题&#xff0c;却没有办法解决&#xff0c;所以写了这一篇…

0032Java程序设计-基于JavaEE的智能化酒店点餐收款系统的设计与实现论文

文章目录 摘 要目录系统设计开发环境 摘 要 酒店点餐收款系统是为了实现酒店餐饮自动化管理而设计的&#xff0c;它完全取代了原来酒店餐饮管理一直使用的人工处理的工作方式&#xff0c;并且避免了由于管理人员的工作疏忽以及管理质量问题所造成的各种错误&#xff0c;为及时…

给定两个单链表,编写算法找出两个链表的公共结点

给定两个单链表&#xff0c;编写算法找出两个链表的公共结点 算法思路&#xff1a; 如果两个链表有公共结点&#xff0c;那从某个公共结点开始&#xff0c;就两路并一路了&#xff0c;类似下图 知道这个性质之后我们就可以解决问题了&#xff0c;先判断出两个链表哪个是长链…

【Jenkins】新建任务FAQ

问题1. 源码管理处填入Repository URL&#xff0c;报错&#xff1a;无法连接仓库&#xff1a;Error performing git command: ls-remote -h https://github.com/txy2023/GolangLearning.git HEAD 原因&#xff1a; jenkins全局工具配置里默认没有添加git的路径&#xff0c;如果…

Openssl数据安全传输平台017:客户端在Linux上的编译与调试记录

文章目录 1 在windows上先预编译2 Centos上进入项目文件夹进行编译2.1 找不到protobuf的google文件夹2.2 找不到动态库ljson2.3 动态库软链接失效2.4 undefined reference to Json::Value::asString[abi:cxx11]() const![在这里插入图片描述](https://img-blog.csdnimg.cn/5a8e…

快递单号批量查询教程,掌握包裹动态,让你成为物流达人!

亲爱的读者们&#xff0c;你是否曾经为了追踪快递包裹而烦恼&#xff1f;是否曾经为了查询多个快递单号而感到繁琐&#xff1f;现在&#xff0c;我们为你带来一个高效便捷的解决方案——快递单号批量查询教程&#xff01;让你轻松掌握包裹动态&#xff0c;成为物流达人&#xf…

【深入浅出】寄存器精讲第一期

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️开篇1.1 &#x1f514;CPU 概述&#xff08;简单了解&#xff09…

两数和的目标 python (初学者vs程序员)

题目描述 1&#xff09;给定一个整数列表&#xff0c;在列表中&#xff0c;从前向后查找两个元素使其相加之和等于目标数&#xff0c;并返回两个整数在列表中的下标。如果没有符合条件的数字&#xff0c;输出False&#xff0c;本题假设题目的解唯一。‬‪‬‪‬‪‬‪‬‮‬‪…