百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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

off999 2025-03-23 22:30 23 浏览 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协议是能够实现多个不同网络间信息传输的协议簇,它包括以下几个主要的协议:

  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读取超时时间如何设置?

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

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

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

相关推荐

使用 python-fire 快速构建 CLI_如何搭建python项目架构

命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。Python是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并...

Python 闭包:从底层逻辑到实战避坑,附安全防护指南

一、闭包到底是什么?你可以把闭包理解成一个"带记忆的函数"。它诞生时会悄悄记下自己周围的变量,哪怕跑到别的地方执行,这些"记忆"也不会丢失。就像有人出门时总会带上...

使用Python实现九九乘法表的打印_用python打印一个九九乘法表

任务要求九九乘法表的结构如下:1×1=11×2=22×2=41×3=32×3=63×3=9...1×9=92×9=18...9×9=81使用Python编写程序,按照上述格式打印出完整的九...

吊打面试官(四)--Java语法基础运算符一文全掌握

简介本文介绍了Java运算符相关知识,包含运算规则,运算符使用经验,特殊运算符注意事项等,全文5400字。熟悉了这些内容,在运算符这块就可以吊打面试官了。Java运算符的规则与特性1.贪心规则(Ma...

Python三目运算基础与进阶_python三目运算符判断三个变量

#头条创作挑战赛#Python中你学会了三步运算,你将会省去很多无用的代码,我接下来由基础到进阶的方式讲解Python三目运算基础在Python中,三目运算符也称为条件表达式。它可以通过一行代码实现条...

Python 中 必须掌握的 20 个核心函数——set()详解

set()是Python中用于创建集合的核心函数,集合是一种无序、不重复元素的容器,非常适合用于成员检测、去重和数学集合运算。一、set()的基本用法1.1创建空集合#创建空集合empty_se...

15个让Python编码效率翻倍的实用技巧

在软件开发领域,代码质量往往比代码数量更重要。本文整理的15个Python编码技巧,源自开发者在真实项目中验证过的工作方法,能够帮助您用更简洁的代码实现更清晰的逻辑。这些技巧覆盖基础语法优化到高级特性...

《Python从小白到入门》自学课程目录汇总(和猫妹学Python)

小朋友们好,大朋友们好!不知不觉,这套猫妹自学Python基础课程已经结束了,猫妹体会到了水滴石穿的力量。水一直向下滴,时间长了能把石头滴穿。只要坚持不懈,细微之力也能做出很难办的事。就比如咱们的学习...

8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……

近日,国外网友因为一道小学数学题在推特上争得热火朝天。事情的起因是一个推特网友@pjmdoll发布了一条推文,让他的关注者解答一道数学题:Viralmathequationshavebeen...

Python学不会来打我(21)python表达式知识点汇总

在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...

Python运算符:数学助手,轻松拿咧

Python中的运算符就像是生活中的数学助手,帮助我们快速准确地完成这些计算。比如购物时计算总价、做家务时分配任务等。这篇文章就来详细聊聊Python中的各种运算符,并通过实际代码示例帮助你更好地理解...

Python学不会来打我(17)逻辑运算符的使用方法与使用场景

在Python编程中,逻辑运算符(LogicalOperators)是用于组合多个条件表达式的关键工具。它们可以将多个布尔表达式连接起来,形成更复杂的判断逻辑,并返回一个布尔值(True或Fa...

Python编程基础:运算符的优先级_python中的运算符优先级问题

多个运算符同时出现在一个表达式中时,先执行哪个,后执行哪个,这就涉及运算符的优先级。如数学表达式,有+、-、×、÷、()等,优先级顺序是()、×、÷、+、-,如5+(5-3)×4÷2,先计算(5-3)...

Python运算符与表达式_python中运算符&的功能

一、运算符分类总览1.Python运算符全景图2.运算符优先级表表1.3.1Python运算符优先级(从高到低)优先级运算符描述结合性1**指数右→左2~+-位非/一元加减右→左3*//...

Python操作Excel:从基础到高级的深度实践

Python凭借其丰富的库生态系统,已成为自动化处理Excel数据的强大工具。本文将深入探讨五个关键领域,通过实际代码示例展示如何利用Python进行高效的Excel操作,涵盖数据处理、格式控制、可视...

取消回复欢迎 发表评论: