我记得很早之前跟路小磊聊过,HTTP请求超时的时间,当时不知道说的是什么,说的是会再后面迭代变更。结果一直到现在都没变更!所以本篇文章需要额外强调,请求需要配置超时的时间!

带有Slf4j日志封装Hutool HTTP工具类

升级版本

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil;
import com.xuelang.taurus.framework.common.exception.TaurusRuntimeException;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 本方法对Hutool Http模块进行封装。全局控制日志、超时处理。
 * 当日志级别为error场景,会打印响应结果。
 */
@Slf4j
public class HttpUtils {

    private static final Integer TIME_OUT_MILLISECOND = 30_000;

    // 输出最大的请求体参数长度(整体超出,则不进行打印请求参数。)
    private static final Integer MAX_PARAMS_LENGTH = 5_000;


    // 发送 GET 请求
    public static String sendGet(String url, Map<String, String> headers) {
        return executeRequest(HttpRequest.get(url), headers, url, null);
    }

    // 发送 POST 请求
    public static String sendPost(String url, Map<String, Object> paramMap, Map<String, String> headers) {
        return executeRequest(HttpRequest.post(url).form(paramMap), headers, url, paramMap);
    }

    // 发送 JSON 数据的 POST 请求
    public static String sendJsonPost(String url, Object jsonData, Map<String, String> headers) {
        String jsonString = JSONUtil.toJsonStr(jsonData);
        return executeRequest(HttpRequest.post(url).body(jsonString), headers, url, jsonString);
    }

    // 执行请求
    private static String executeRequest(HttpRequest request, Map<String, String> headers, String url, Object params) {
        if (headers != null) {
            request.headerMap(headers, true);
        }
        logRequest(request, url, params);
        HttpResponse response = request.timeout(TIME_OUT_MILLISECOND).execute();
        return handleResponse(response);
    }

    // 请求前打印日志。为了避免日志过大。日志长度超过5K,则不再输出。
    private static void logRequest(HttpRequest request, String url, Object params) {
        String method = String.valueOf(request.getMethod());
        StringBuilder logMessage = new StringBuilder("发送 " + method + " 请求,URL: " + url);

        if (params != null) {
            String paramsString = JSONUtil.toJsonStr(params);
            // 限制日志长度
            if (paramsString.length() > MAX_PARAMS_LENGTH) {
                logMessage.append(", 参数: [内容过大,长度: ").append(paramsString.length()).append("]");
            } else {
                logMessage.append(", 参数: ").append(paramsString);
            }
        }
        log.info(logMessage.toString());
    }


    // 处理响应
    private static String handleResponse(HttpResponse response) {
        int status = response.getStatus();
        if (status == HttpStatus.HTTP_OK) {
            String responseBody = response.body();
            log.debug("请求成功,状态码:{}, 响应内容:{}", status, responseBody);
            return responseBody;
        } else {
            log.debug("请求失败,状态码:{}, 响应内容:{}", status, response.body());
            throw new RuntimeException("有异常");
        }
    }
}

老版本

@Slf4j
public class HttpUtils {

    // 发送 GET 请求
    public static String sendGet(String url) {
        log.info("发送 GET 请求,URL: {}", url);
        HttpResponse response = HttpRequest.get(url).timeout(2000).execute();
        return handleResponse(response);
    }

    // 发送 POST 请求
    public static String sendPost(String url, Map<String, Object> paramMap) {
        log.info("发送 POST 请求,URL: {}, 参数: {}", url, paramMap);
        HttpResponse response = HttpRequest.post(url).form(paramMap).timeout(2000).execute();
        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);
        HttpResponse response = HttpRequest.post(url).body(jsonString).timeout(2000).execute();
        return handleResponse(response);
    }

    // 发送带请求头的 GET 请求
    public static String sendGetWithHeaders(String url, Map<String, String> headers) {
        log.info("发送带请求头的 GET 请求,URL: {}, 请求头: {}", url, headers);
        HttpResponse response = HttpRequest.get(url).headerMap(headers, true).timeout(2000).execute();
        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);
        HttpResponse response = HttpRequest.post(url).form(paramMap).headerMap(headers, true).timeout(2000).execute();
        return handleResponse(response);
    }

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

原始无封装请求演示

Post请求 这里处理Json使用的是fastjson

        // 拼接URL
        String url = "你的URL";

        // 请求体参数对象 params
        Map<String, Object> params = new HashMap<>();
        params.put("userAccount", "740969606");



        // 创建HTTP请求对象
        HttpRequest post = HttpUtil.createPost(url);

        // 设定请求头
        post.header(Header.CONTENT_TYPE,"application/json");

        // 设定请求体
        post.body(JSONObject.toJSONString(params));
        //post.form(params); //特别说明,form表单提交也在请求体里,但服务接收不一定支持form表单内容


        // 执行请求
        HttpResponse execute = post.timeout(2000).execute();

        // 解析结果
        // FASTJSON用:JSONObject jsonObject = JSONObject.parseObject(execute.body());
        JSONObject jsonObject = JSONUtil.parseObj(response.body());

GET请求

参数放在URL中

        String url = "你要请求的URL";
        StringBuilder urlWithParams =  new StringBuilder(url.trim()).append("?");
        // 请求体参数对象 params
        Map<String, String> params = new LinkedHashMap<>();
        params.put("userAccount", "740969606");

        // 拼接的GET请求的参数内容在URL中
        params.forEach((k,v)->{
            urlWithParams.append(k).append("=").append(v).append("&");
        });
        // 创建Http Get请求对象,同时指定最新带参数的url
        HttpRequest get = HttpUtil.createGet(urlWithParams.toString());
        // 设定请求头
        get.header(Header.AUTHORIZATION,"我是Token");
        // 执行请求
        HttpResponse execute = get.timeout(2000).execute();
        // 解析结果
        JSONObject jsonObject = JSONObject.parseObject(execute.body());
        System.out.println(jsonObject);

参数放在form中

        String GD_WEATHER_URL = "https://restapi.amap.com/v3/weather/weatherInfo";
        StringBuilder urlWithParams = new StringBuilder(GD_WEATHER_URL).append("?");
        // 请求体参数对象 params
        Map<String, Object> params = new LinkedHashMap<>();
        params.put(GD_WEATHER_ARG_KEY, "dc81de5a83995509bd76c6a03d62ee20"); // 个人测试高德API的Key。
        params.put(GD_WEATHER_ARG_CITY, "320211");   // adcode城市编码。可在 查看
        params.put(GD_WEATHER_ARG_EXTENSIONS, "base"); // 可选值:base/all;base:返回实况天气;all:返回预报天气
        params.put(GD_WEATHER_ARG_OUTPUT, "JSON"); // 返回格式;可选值:JSON,XML
        // 创建Http Get请求对象,同时指定最新带参数的url
        HttpRequest get = HttpUtil.createGet(urlWithParams.toString());
        // 执行请求
        HttpResponse execute = get.form(params).timeout(2000).execute();
        // 解析结果
        JSONObject jsonObject = JSONUtil.parseObj(execute.body());
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤

免责声明:
本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。