如何获取HTTP请求时间与响应时间【附源码】

这篇具有很好参考价值的文章主要介绍了如何获取HTTP请求时间与响应时间【附源码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何获取HTTP请求时间与响应时间【附源码】

一、问题描述

今日遇到了一个问题,要去获取HTTP报文在请求响应的时间,因为没有原生的API可以调用,所以需要一定的技巧~

  • 下面主体的框架和代码,我使用了form表单去构造一个POST请求,然后在Servlet中重写doPost()方法,然后实现获取请求时间和响应时间的代码逻辑
<form action="print" method="post">
    <input type="submit" value="打印信息">
</form>
@WebServlet("/print")
public class printServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//...
    }
}

二、抓包观察

我们可以先去观察一下在发起POST请求后这个HTTP请求报文中是否在这个请求时间,如果有的其实可以把它通过一定手段获取到

  • 但遗憾的是,我并没有发现任何与时间相关的东西😥

如何获取HTTP请求时间与响应时间【附源码】

  • 那再到请求报文中去看看的话,就发现了与时间相关的内容,不过对照现在的时间仔细一看的话,却查了不少,网上一搜就发现GMT是格林尼治时间,要比现在的时候早上8个小时,但看到一个时间却非常激动,想着如何拿到它

如何获取HTTP请求时间与响应时间【附源码】

三、查找文档

因为【HttpServletRequest】和【HttpServletResponse】给我们提供了许多原生API,所以我们可以去找找看有哪些API是我们可以用得上的,这里推荐直接进官网 ——> 链接

如何获取HTTP请求时间与响应时间【附源码】

  • 可以看到,无论是前者还是后者都未我们提供了很多的方法,这也我也会在代码中使用几个,不过找了一圈我发现完全没有获取时间的那种API,于是就没有再查找下去了

如何获取HTTP请求时间与响应时间【附源码】

四、思考尝试

再找了很久还是一无所获,干脆就想着自己去手动获取一下这个时间

  • 此时我就想到了Java里面的Date类,可以获取当前系统的时间,以及随之对应的是格式化解析SimpleDateFormat(),于是便立马写下了这几句代码
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEEE");//格式化日期
Date currentTime = new Date();//获取当前时间
String date = formatter.format(currentTime).toString();

💬 但是要怎么使用这个当前时间呢?去获取哪段时间呢?

  • 首先我就提出了上面这个问题,思考了一下从Tomcat解析HTTP请求到将其交给Servlet做处理,那么能够最早获取到时间的地方就是一开始进入doPost()的时候,我们记录下当前的时间,就可以将其近似于HTTP的请求时间

💬 请求时间有了,那响应时间呢?也用这个去求吗?

  • 这个的话不一定,因为刚才我们看了HTTP的响应报文,也就是服务端在处理完数据后给浏览器返回的一个响应,里面是存在【Date】这个时间的,你可以选择使用getHeaderNames()先获取到整个报文的头部,因为他的返回值是一个Collection集合,所以你可以通过遍历集合的方式与getHeader()相配合格式化地输出里面的内容,这里我就不细说了
  • 也是一样,我们可以通过上面这种方式去获取响应时间,何时获取才是最正确的呢?那就是在resp.getWriter().write()这个发还响应之前去获取时间,这是最后的机会了!

五、精益求精

通过返回我们在后端代码中获取到的时间,将其返还给浏览器时便看到这个【请求时间】和【响应时间】是一样的,这是为什么呢?

如何获取HTTP请求时间与响应时间【附源码】

  • 仔细观察我设置的日期格式化,是精确到秒的,如果你有一点计算机常识的话就可以知道计算机的运行速度是很快的,基本是以纳秒为单位,此时我们若是只精确到秒 的话可能还看不太出来,应该再多精确几位
yyyy-MM-dd HH:mm:ss
  • 可以看到,此时我精确到了纳秒的级别,此时再去观察的话就会有所不同
yyyy-MM-dd HH:mm:ss.SSSSSSSSS
  • 可以看到虽然精确了很多位数,但是二者之间的差距还是很小,毕竟计算机的处理速度也是非常快的

如何获取HTTP请求时间与响应时间【附源码】

但是这么去做的只是钻了一个牛角尖🐂,后面我又想到了一个更聪明的办法

  • 那就是让程序等待一段时间!
try {
    Thread.sleep(500);      //让程序暂停0.5s
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}
  • 学习过Java多线程的同学一定马上就能反应过来了,可以使用Thread类中的sleep()方法让程序睡上几秒,然后再去获取时间。此时我们再去观察【请求时间】和【响应时间】的话就会有些差距了。如果你想让差距更加明显的话可以让程序多睡一会

如何获取HTTP请求时间与响应时间【附源码】

六、源码解说

这里的话附上我们解决本体所用的源码

前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表单</title>
</head>
<body>
    <form action="print" method="post">
        <input type="submit" value="打印信息">
    </form>
</body>
</html>

后端:

@WebServlet("/print")
public class printServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        // 在doPost()方法开始时获取一下请求时间
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS");//格式化日期
        Date currentTime=new Date();//获取当前时间
        String date=formatter.format(currentTime).toString();

        StringBuilder stringBuilder = new StringBuilder();

        System.out.println("-------------------------------------------------");
        stringBuilder.append("请求的URL = " +  req.getRequestURL());   //请求的URL
        stringBuilder.append("<br>");
        stringBuilder.append("请求方法 = " + req.getMethod());        //请求方法
        stringBuilder.append("<br>");
        stringBuilder.append("请求时间 = " + date);                                  //请求时间
        stringBuilder.append("<br><br>");

        try {
            Thread.sleep(500);      //让程序暂停0.5s
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        // 在doPost()方法快结束时获取一下响应时间
        currentTime = new Date();//获取当前时间
        String date2 = formatter.format(currentTime).toString();
        stringBuilder.append("响应时间 = " + date2);
        stringBuilder.append("<br>");

        stringBuilder.append("响应状态码 = " + resp.getStatus());
        stringBuilder.append("<br>");

        resp.getWriter().write(stringBuilder.toString());
    }
}

💬 稍微来讲一下后端的这块逻辑

  • 这边我主要使用到的就是这个【StringBuilder】类,使用它构造出来的对象,我们需要在单线程的环境下连接多个字符串,此时用它最合适了,通过里面的append()方法去进行连接,这里我测试了Reques和Response两个类中的方法,打印出了HTTP报文的一些内容
  • 还要注意,有些同学在看我这句代码的时候很疑惑,所我怎么把前端的代码写到后端来了
stringBuilder.append("<br>");
  • 这里主要就是依赖于前面的这句代码,我将当前body中的数据格式设置为了HTML,代表可以识别HTML代码,所以这个<br>就会被当做换行了,若是不写这个的话所有的内容都会挤在一起的
 resp.setContentType("text/html;charset=utf-8");
  • 最后的这句话就是将拼接的StringBuilder类型字符串转换为String类型并发还给浏览器一个响应,将拼接的内容都打印展示出来
resp.getWriter().write(stringBuilder.toString());

2023年5月22日记

如何获取HTTP请求时间与响应时间【附源码】文章来源地址https://www.toymoban.com/news/detail-482577.html

到了这里,关于如何获取HTTP请求时间与响应时间【附源码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码

    通过自定义filter,RequestWrapper,ResponseWrapper 处理请求和响应数据,比如修改请求体和响应体的字符编码 1.request 和 response 中的数据都是 存在流中的(缓存中)获取一次就没有了,需要重新写回去。所以需要两个包装类分别继承HttpServletRequestWrapper 和 HttpServletResponseWrapper 对 r

    2024年02月15日
    浏览(41)
  • 【HarmonyOS】【ArkTS】如何使用HTTP网络请求获取动态数据刷新UI界面

    【】 HttpRequest、ArkTS、网络数据请求、@ohos.net.http 【前言】 在使用ArkTS开发HarmonyOS应用时,需要调用HTTP网络请求 @ohos.net.http 动态获取数据,进行UI列表刷新,这想必是应用开发最常见的功能。但是根据官网网络请求的示例代码进行功能开发时,封装方法进行HTTP请求后

    2024年02月08日
    浏览(47)
  • HTTP请求响应详解 (HTTP请求数据格式,常见请求方式,后端响应参数)及Apifox(postman)使用方式

    目录 一.HTTP协议  二.HTTP请求数据格式  请求方式 三.后端响应请求 基于SpringBoot响应数据 请求响应的参数类型 同一响应格式 四.Apifox(postman)使用方法 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。 HTTP的特点和工作原理如下

    2024年03月09日
    浏览(69)
  • 请求响应-日期时间参数的接受

    由于从前端发送的请求中,日期的格式可能各不相同,使用 @DateTimeFormat 注解完成日期参数格式的转换 具体关键代码如下:   在postman中发出对应请求携带对应参数结果如下: 参数名称要与方法中的形参名称一致,免得还要设置    

    2024年02月13日
    浏览(52)
  • Java http 响应式请求和非响应式请求有什么区别

    以下是一个使用Spring WebFlux实现真正的流式编程的案例: 运行Spring Boot应用程序,并使用浏览器或类似cURL的工具发送GET请求: 获取所有用户的请求:http://localhost:8080/users/stream 你将会看到一个持续不断的流式响应,每秒钟返回一个用户对象。这个案例中,我们使用了 @GetMapp

    2024年01月17日
    浏览(75)
  • HTTP、请求和响应

    1.规定了交互的方式:请求、响应 2.数据的格式:行、头、体 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像

    2024年02月20日
    浏览(39)
  • HTTP协议,请求响应

    2024年02月07日
    浏览(43)
  • HTTP工具类封装与http请求响应

    一、前言 在Java web系统中经常需要与外部接口进行对接,比较多的方式就是是http的方式。在springboot中,我们可以直接使用封装的feign如:我们去请求微信的接口,定义一个client客户端,使用feign框架去请求就可以。但是也有很多系统没有使用feign的框架,那就需要使用http工具

    2024年04月25日
    浏览(30)
  • 接口响应时间长,前端返回请求超时解决

    1. 全局设置 axios.defaults.timeout = 时间 // 单位为毫秒 或 2. 封装的http请求 或 3. nginx默认的响应时间是60S 还需要修改nginx.conf文件 在配置的请求代理下添加 单位为秒

    2024年02月12日
    浏览(69)
  • 《二》HTTP 请求报文和响应报文、请求方法、状态码

    请求报文: 客户端向服务器发送的请求信息,就叫做请求报文。 客户端发送一个 HTTP 请求到服务器,请求信息包含四部分:请求行、请求头、空行、请求体。 请求行:包含三部分,分别是请求方法、请求资源的路径、协议版本。 请求头:头信息,告诉服务器一些信息,在客

    2023年04月26日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包