我记得很早之前跟路小磊聊过,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博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
