Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hutool Http请求工具依据参数记录响应版

Hutool Http请求工具依据参数记录响应版

作者头像
收心
发布于 2024-01-11 01:21:47
发布于 2024-01-11 01:21:47
57900
代码可运行
举报
文章被收录于专栏:Java实战博客Java实战博客
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;

import static java.net.HttpURLConnection.HTTP_OK;

/**
 * 本工具是用于内网请求数据调试使用,会将请求响应的内容写入本地文件,下次请求时会先检查本地文件是否存在,如果存在则直接读取本地文件,不再发送请求。
 * 这样可以将本地文件拿出来,放到外网环境下,直接读取本地文件,就可以模拟内网环境下的请求。后续类似需求,可以修改本工具,实现更多功能。
 * <p>
 * 当前需求将cookie忽略掉!jadp每次加密的密码不一样,导致请求参数每次都不一样,就认为是新请求,就不再走缓存,导致报错。
 */
@Slf4j
public class HttpUtilsDebug {

    public static void main(String[] args) {
        String s = sendGet("https://www.zanglikun.com", "2");
    }

    // 将缓存文件夹设置为与项目代码同级的目录
    private static final String CACHE_FOLDER = System.getProperty("user.dir") + File.separator + "httpUtilDebug" + File.separator + "cache";

    // 确保缓存文件夹存在
    static {
        File cacheDir = new File(CACHE_FOLDER);
        if (!cacheDir.exists()) {
            cacheDir.mkdirs(); // 如果缓存文件夹不存在,则创建它
        }
    }

    // 发送 GET 请求
    public static String sendGet(String url, String cookie) {
        log.info("发送 GET 请求,URL: {}", url);
        String cacheKey = generateCacheKey(url, null, cookie);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.get(url).cookie(cookie).execute();
        cacheResponse(url, null, cookie, response);
        return handleResponse(response);
    }

    // 发送 POST 请求
    public static String sendPost(String url, Map<String, Object> paramMap, String cookie) {
        log.info("发送 POST 请求,URL: {}, 参数: {}", url, paramMap);
        String cacheKey = generateCacheKey(url, paramMap, cookie);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.post(url).cookie(cookie).form(paramMap).execute();
        cacheResponse(url, paramMap, cookie, response);
        return handleResponse(response);
    }

    // 发送 JSON 数据的 POST 请求
    public static String sendJsonPost(String url, Object jsonData) {
        String jsonString = JSONUtil.toJsonStr(jsonData);
        log.info("发送 JSON POST 请求,URL: {}, JSON 数据: {}", url, jsonString);
        String cacheKey = generateCacheKey(url, jsonString, null);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.post(url).body(jsonString).execute();
        cacheResponse(url, jsonString, null, response);
        return handleResponse(response);
    }

    // 发送 JSON 数据的 POST 请求
    public static String sendJsonPostWithHeader(String url, Object jsonData, Map<String, String> headers) {
        String jsonString = JSONUtil.toJsonStr(jsonData);
        log.info("发送 JSON POST 请求,URL: {}, JSON 数据: {}", url, jsonString);
        String cacheKey = generateCacheKey(url, jsonString, null);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.post(url).headerMap(headers, true).body(jsonString).execute();
        cacheResponse(url, jsonString, null, response);
        return handleResponse(response);
    }

    // 发送 JSON 数据的 POST 请求
    public static String sendJsonPost(String url, Object jsonData, String cookie) {
        String jsonString = JSONUtil.toJsonStr(jsonData);
        log.info("发送 JSON POST 请求,URL: {}, JSON 数据: {}", url, jsonString);
        String cacheKey = generateCacheKey(url, jsonString, cookie);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.post(url).cookie(cookie).body(jsonString).execute();
        cacheResponse(url, jsonString, cookie, response);
        return handleResponse(response);
    }

    // 发送带请求头的 GET 请求
    public static String sendGetWithHeaders(String url, Map<String, String> headers) {
        log.info("发送带请求头的 GET 请求,URL: {}, 请求头: {}", url, headers);
        String cacheKey = generateCacheKey(url, null, headers);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.get(url).headerMap(headers, true).execute();
        cacheResponse(url, null, headers, response);
        return handleResponse(response);
    }

    // 发送带请求头的 POST 请求
    public static String sendPostWithHeaders(String url, Map<String, Object> paramMap, Map<String, String> headers) {
        log.info("发送带请求头的 POST 请求,URL: {}, 参数: {}, 请求头: {}", url, paramMap, headers);
        String cacheKey = generateCacheKey(url, paramMap, headers);
        String cachedResponse = checkCache(cacheKey);
        if (cachedResponse != null) {
            return cachedResponse;
        }
        HttpResponse response = HttpRequest.post(url).form(paramMap).headerMap(headers, true).execute();
        cacheResponse(url, paramMap, headers, response);
        return handleResponse(response);
    }

    // 发送带请求头的 POST 请求
    public static String sendDeleteWithHeaders(String url, String cookie) {
        log.info("发送带请求头的 Delete 请求,URL: {}", url);
        HttpResponse response = HttpRequest.delete(url).contentType("application/json").cookie(cookie).execute();
        return handleResponse(response);
    }

    // 处理响应
    public static String handleResponse(HttpResponse response) {
        int status = response.getStatus();
        if (status == HTTP_OK) {
            String responseBody = response.body();
            log.info("请求成功,状态码:{}, 响应内容:{}", status, responseBody);
            return responseBody;
        } else {
            // 可根据实际需求处理其他状态码
            throw new RuntimeException("请求失败,状态码:" + status);
        }
    }

    // 缓存响应
    private static void cacheResponse(String url, Object params, Object headersOrCookie, HttpResponse response) {
        String cacheKey = generateCacheKey(url, params, headersOrCookie);
        String cacheFilePath = CACHE_FOLDER + File.separator + cacheKey + ".txt";
        try {
            FileUtil.writeString(response.body(), cacheFilePath, "UTF-8");
        } catch (Exception e) {
            log.error("缓存响应时出错:", e);
        }
    }

    // 生成缓存文件的键
    private static String generateCacheKey(String url, Object params, Object headersOrCookie) {
        String paramsString = params != null ? params.toString() : "";
        String headersOrCookieString = headersOrCookie != null ? headersOrCookie.toString() : "";
        // 使用 URL、参数和 cookie/header 生成一个唯一的缓存键
        String rawCacheKey = url + paramsString; // 忽略掉cookie + headersOrCookieString;
        // 使用 MD5 生成一个较短的键名
        return DigestUtil.md5Hex(rawCacheKey);
    }

    // 检查缓存
    private static String checkCache(String cacheKey) {
        String cacheFilePath = CACHE_FOLDER + File.separator + cacheKey + ".txt";
        if (FileUtil.exist(cacheFilePath)) {
            log.info("缓存命中,读取缓存内容:{}", cacheFilePath);
            return FileUtil.readString(cacheFilePath, "UTF-8");
        } else {
            // 缓存未命中,尝试从resources目录读取
            String resourcePath = "/httpUtilDebug/cache/" + cacheKey + ".txt";
            InputStream inputStream = HttpUtil.class.getResourceAsStream(resourcePath);
            if (inputStream != null) {
                try {
                    log.info("从resources目录读取缓存内容:{}", resourcePath);
                    return IoUtil.read(inputStream, StandardCharsets.UTF_8);
                } catch (Exception e) {
                    log.error("从resources目录读取文件时出错:", e);
                } finally {
                    IoUtil.close(inputStream);
                }
            }
        }
        return null;
    }


}

特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com 第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java中的HTTP请求
URLConnection的优点是内置于Java标准库中,无需引入其他依赖。而HttpClient需要引入额外的包和依赖。
码客说
2024/01/15
3650
Java调用外部REST请求的几种方式
1、RestOperations 提供了各种封装方法,非常方便直接将返回转成实体类。
伍六七AI编程
2022/03/23
9150
Django请求和响应对象
当一个页面被请求时,Django 会创建一个 HttpRequest 对象,这个对象包含了请求的元数据。然后,Django 加载相应的视图,将 HttpRequest 作为视图函数的第一个参数。每个视图负责返回一个 HttpResponse 对象。
zy010101
2021/11/01
1.7K0
OkHttp搞定Http请求
当网络出现问题时,OkHttp会自动恢复一般的连接问题;若服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP。
鱼找水需要时间
2023/02/16
2.7K0
Angular HttpClient 拦截器
在之前的 Angular 6 HttpClient 快速入门 文章中,我们已经简单介绍了 Http 拦截器。本文将会进一步分析一下 Http 拦截器。拦截器提供了一种用于拦截、修改请求和响应的机制。这个概念与 Node.js 的 Express 框架中间件的概念类似。拦截器提供的这种特性,对于日志、缓存、请求授权来说非常有用。
阿宝哥
2019/11/05
2.9K0
SpringBoot系列之RestTemplate使用示例
博主之前经常对接一些接口,所以发现写一些http请求比较麻烦,学习springboot的过程知道可以用RestTemplate来做http请求,RestTemplate是Spring Framework框架封装的基于模板方法设计模式的一个工具类,带有同步模板方法 API 的原始 Spring REST 客户端类,下面博主分析一些对接过程的一些经验,RestTemplate基本使用可以参考官网文档:https://docs.spring.io/spring-framework/docs/5.1.6.RELEASE/spring-framework-reference/integration.html#rest-client-access
SmileNicky
2022/05/07
1.5K0
SpringBoot系列之RestTemplate使用示例
Java发送HTTP 请求
请求http的Demo是个人亲测过,目前该方式已经在线上运行着。因为是http请求,所有发送post 和get 请求的demo都有在下方贴出,包括怎么测试,大家可直接 copy到自己的项目中使用。
胖虎
2019/06/26
2.5K0
Go语言之Golang http请求库HttpRequest[通俗易懂]
Go语言HttpRequest项目源码地址: https://github.com/kirinlabs/HttpRequest
全栈程序员站长
2022/09/10
3.3K0
Flutter-Dart基于 Dio 的 HTTP 请求工具类
Flutter 基于 Dio 封装的一个 HTTP 请求工具类(XHttp),使用单例方便全局请求管理与使用。 包括请求拦截、响应拦截、错误拦截、请求 Hooks、日志输出、取消请求、取消重复请求、设置白名单、权限管控、基础请求等等功能。
老猫-Leo
2023/12/11
1.1K2
作为一个Java程序员如何对接外部接口?
我经历的几个公司,几乎都有外部接口需要我们进行对接,有的第三方给我们提供相关API,我们采用API直接调用即可,但是实际上,大部分公司内部的文档是一言难尽的。但是学习本身就是一个建模的过程!我来分享一下,我对外部接口对接的相关理解。
收心
2023/04/22
1.1K0
使用Java在国内不访问国外网站调用Chatgpt API实现问答对话
OpenAI开放的api接口调用很简单,只要用post请求就可以了。但是因为地区限制,国内无法直接使用这个方法。但我们可以通过Cloudflare来进行套壳转发请求来完成国内对openai的访问。
I Teach You 我教你
2023/07/18
1.6K0
使用Java在国内不访问国外网站调用Chatgpt API实现问答对话
性能工具之Ngrinder之Post请求脚本编写介绍
前置条件是大家源码部署成功的,这样方面咱们直接在源码的脚本位置添加咱们调试的脚本,下面咱们使用两种方式做例子分别介绍:
高楼Zee
2019/10/29
1.3K0
性能工具之Ngrinder之Post请求脚本编写介绍
Django之HttpRequest和HttpReponse
  当一个web请求链接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的试图函数,每个请求的试图函数都会返回一个HttpResponse对象。
全栈程序员站长
2022/07/18
3620
HTTP、RPC、UI、SQL自动化封装示例(JAVA)
以下是基于java,分别通过HttpClient、Dubbo、Selenium、JdbcTemplate实现Http、RPC、UI、SQL操作的示例代码。导入依赖包后可直接复制代码执行。
骆小生
2023/03/29
2.1K0
Volley框架源码解析
在 2013 年的 Google I/O 大会上,Volley 网络通信框架正式发布。Volley 框架被设计为适用于网络请求非常频繁但是数据量并不是特别大的情景,正如它的名字一样。Volley 相比其他网络框架而言,采用了在 Android 2.3 以下使用 HttpClient ,而 Android 2.3 及以上使用 HttpUrlConnection 的方案。这是因为在 Android 2.3 以下时,HttpUrlConnection 并不完善,有很多 bug 存在。因此在 Android 2.3 以下最好使用 HttpClient 来进行网络通信;而在 Android 2.3 及以上,HttpUrlConnection 比起 HttpClient 来说更加简单易用,修复了之前的 bug 。所以在 Android 2.3 及以上我们使用 HttpUrlConnection 来进行网络通信。
俞其荣
2022/07/28
2.1K0
Volley框架源码解析
Java 编程问题:十三、HTTP 客户端和 WebSocket API
本章包括 20 个问题,旨在介绍 HTTP 客户端和 WebSocket API。
ApacheCN_飞龙
2022/07/11
7K0
Vertx-client框架-高性能 HTTP 请求框架
在当今的软件开发中,高效的网络通信是至关重要的。本文将介绍一种基于高性能底层 Netty 的 Vertx 框架的简单 HTTP 请求封装方法,它能够承载更多的网络 IO 请求,为我们的应用程序提供更强大的网络通信能力。
用户5271782
2024/11/14
1310
26. 应用层HTTP原理(4) —— HTTP Server(完成一个登录页面)
首先需要在这里创建一下文件,在index.html中写入想从网页上返回的内容,这里是需要完成一个登录页面,因此html中的内容如下:
小雨的分享社区
2022/10/26
3060
26. 应用层HTTP原理(4) —— HTTP Server(完成一个登录页面)
网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
在本系列的上一篇文章中,我们走读了一遍okhttp的源码,初步了解了这个强大的网络框架的基本执行流程。
胡飞洋
2020/07/23
2.9K0
网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
Apache httpClient+Jackson学习笔记
HTMLUnit可以用来做爬虫的。Jsoup比他跟简洁。使用python语言进行爬虫.开箱即用。
全栈程序员站长
2022/06/30
2.6K0
Apache httpClient+Jackson学习笔记
相关推荐
Java中的HTTP请求
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验