package com.whdc.common.utils; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Map; /** * @author lyf * @since 2025-06-25 */ @Slf4j @Component public class HttpHelper { @Autowired private OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); // public @NotNull String get(@NotNull String url, @Nullable Map params, @Nullable Map headers) { // if (url.isEmpty()) { // return "url为空"; // } // // Request.Builder requestBuilder = new Request.Builder() // .url(url) // .get(); // // //header // if (headers != null) { // for (Map.Entry entry : headers.entrySet()) { // String key = entry.getKey(); // String value = entry.getValue(); // if (key != null && value != null) { // requestBuilder.header(key, value); // } // } // } // //doGet // Request request = requestBuilder.build(); // // return doGet(request); // } // // private @NotNull String doGet(Request request) { // try (Response response = okHttpClient.newCall(request).execute()) { // if (response.isSuccessful() && response.body() != null) { // return response.body().string(); // } else { // return "请求失败:" + response; // } // } catch (IOException e) { // return "网络异常:" + e.getMessage(); // } // } public @NotNull String postJsonString(@NotNull String url, @Nullable String json, @Nullable Map headers) { return postJsonString(url, json, headers, StandardCharsets.UTF_8); } public @NotNull String postJsonString(@NotNull String url, @Nullable String json, @Nullable Map headers, @NotNull Charset charset) { if (url.isEmpty()) { return "url为空"; } if (json == null) { json = "{}"; } //mediatype MediaType mediaType = MediaType.get("application/json"); //payload RequestBody requestBody = RequestBody.create(json, mediaType); //builder Request.Builder requestBuilder = new Request.Builder() .url(url) .header("Content-Type", mediaType + ";charset=" + charset.name()) .post(requestBody); //header if (headers != null) { for (Map.Entry entry : headers.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (key != null && value != null) { requestBuilder.header(key, value); } } } Request request = requestBuilder.build(); //post String resp = doPost(request); if (resp.contains("请求失败") || resp.contains("网络异常")) { log.warn("请求失败request:{}", request); log.warn("请求失败request header:{}", headers); log.warn("请求失败request payload:{}", json); } return resp; } public @NotNull String postFormData(@NotNull String url, @Nullable Map params, @Nullable Map headers) { return postFormData(url, params, headers, StandardCharsets.UTF_8); } public @NotNull String postFormData(@NotNull String url, @Nullable Map params, @Nullable Map headers, @NotNull Charset charset) { if (url.isEmpty()) { return "url为空"; } //mediatype MediaType mediaType = MultipartBody.FORM; //payload MultipartBody.Builder bodyBuilder = new MultipartBody.Builder() .setType(MultipartBody.FORM); if (params != null) { for (Map.Entry entry : params.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); if (key == null || value == null) { continue; } if (value instanceof String) { bodyBuilder.addFormDataPart(key, (String) value); } else if (value instanceof File) { File file = (File) value; RequestBody fileBody = RequestBody.create(file, MediaType.get("application/octet-stream")); bodyBuilder.addFormDataPart(key, file.getName(), fileBody); } else { return "不支持的参数类型"; } } } RequestBody requestBody = bodyBuilder.build(); //builder Request.Builder requestBuilder = new Request.Builder() .url(url) .header("Content-Type", mediaType + ";charset=" + charset.name()) .post(requestBody); //header if (headers != null) { for (Map.Entry entry : headers.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (key != null && value != null) { requestBuilder.header(key, value); } } } //post Request request = requestBuilder.build(); String resp = doPost(request); if (resp.contains("请求失败") || resp.contains("网络异常")) { log.warn("请求失败request:{}", request); log.warn("请求失败request header:{}", headers); log.warn("请求失败request payload:{}", params); } return resp; } public @NotNull String postFormUrlEncoded(@NotNull String url, @Nullable Map params, @Nullable Map headers) { return postFormUrlEncoded(url, params, headers, StandardCharsets.UTF_8); } public @NotNull String postFormUrlEncoded(@NotNull String url, @Nullable Map params, @Nullable Map headers, @NotNull Charset charset) { if (url.isEmpty()) { return "url为空"; } //mediatype MediaType mediaType = MediaType.get("application/x-www-form-urlencoded"); //payload FormBody.Builder bodyBuilder = new FormBody.Builder(charset); if (params != null) { for (Map.Entry entry : params.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); if (key != null && value != null) { try { // Manually encode using GBK String encodedValue = URLEncoder.encode(value.toString(), "GBK"); bodyBuilder.addEncoded(key, encodedValue); } catch (Exception e) { return "参数encode错误"; } } } } RequestBody formBody = bodyBuilder.build(); //builder Request.Builder requestBuilder = new Request.Builder() .url(url) .header("Content-Type", mediaType + ";charset=" + charset.name()) .post(formBody); //header if (headers != null) { for (Map.Entry entry : headers.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (key != null && value != null) { requestBuilder.header(key, value); } } } //post Request request = requestBuilder.build(); String resp = doPost(request); if (resp.contains("请求失败") || resp.contains("网络异常")) { log.warn("请求失败request:{}", request); log.warn("请求失败request header:{}", headers); log.warn("请求失败request payload:{}", params); } return resp; } private @NotNull String doPost(Request request) { try (Response response = okHttpClient.newCall(request).execute()) { if (response.isSuccessful() && response.body() != null) { return response.body().string(); } else { log.warn("请求失败response:{}", response); return "请求失败:" + response; } } catch (IOException e) { return "网络异常:" + e.getMessage(); } } }