package com.zsElectric.boot.common.util; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.List; import java.util.Map; @Slf4j @Component public class OkHttpUtil { private final OkHttpClient okHttpClient; private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public OkHttpUtil(OkHttpClient okHttpClient) { this.okHttpClient = okHttpClient; } /** * 执行 GET 请求,返回 JsonObject */ public JsonObject doGet(String url, Map headers) throws IOException { Request.Builder requestBuilder = new Request.Builder().url(url); if (headers != null) { headers.forEach(requestBuilder::addHeader); } Request request = requestBuilder.build(); try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code: " + response); } String responseBody = response.body().string(); return JsonParser.parseString(responseBody).getAsJsonObject(); } } /** * 执行 POST 请求(JSON 数据),返回 JsonObject */ public JsonObject doPostJson(String url, String json, Map headers) throws IOException { RequestBody body = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder() .url(url) .post(body); if (headers != null) { headers.forEach(requestBuilder::addHeader); } Request request = requestBuilder.build(); try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code: " + response); } String responseBody = response.body().string(); return JsonParser.parseString(responseBody).getAsJsonObject(); } } /** * 执行 POST 请求(表单数据),返回 JsonObject */ // public JsonObject doPostForm(String url, Map formData, Map headers) throws IOException { // FormBody.Builder formBodyBuilder = new FormBody.Builder(); // if (formData != null) { // formData.forEach((k, v) -> formBodyBuilder.add(k, String.valueOf(v))); // } // // Request.Builder requestBuilder = new Request.Builder() // .url(url) // .addHeader("Content-Type", "application/json; charset=utf-8") // .post(formBodyBuilder.build()); // // if (MapUtil.isNotEmpty(headers)) { // headers.forEach(requestBuilder::addHeader); // } // // Request request = requestBuilder.build(); // request.header("Content-Type:application/json; charset=utf-8"); // log.info("POST 请求 URL: " + url); // log.info("POST 请求表单数据: " + formData); // try (Response response = okHttpClient.newCall(request).execute()) { // if (!response.isSuccessful()) { // throw new IOException("Unexpected code: " + response); // } // String responseBody = response.body().string(); // return JsonParser.parseString(responseBody).getAsJsonObject(); // } // } public JsonObject doPostForm(String url, Map formData, Map headers) throws IOException { FormBody.Builder formBodyBuilder = new FormBody.Builder(); if (formData != null) { formData.forEach((k, v) -> formBodyBuilder.add(k, String.valueOf(v))); } Request.Builder requestBuilder = new Request.Builder() .url(url) .post(formBodyBuilder.build()); // 正确设置 Content-Type header if (MapUtil.isNotEmpty(headers)) { headers.forEach(requestBuilder::addHeader); } // 如果需要覆盖 Content-Type,应该在这里设置 requestBuilder.addHeader("Content-Type", "application/json"); Request request = requestBuilder.build(); log.info("POST 请求 URL: " + url); log.info("POST 请求表单数据: " + formData); try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code: " + response); } String responseBody = response.body().string(); return JsonParser.parseString(responseBody).getAsJsonObject(); } } /** * 异步 GET 请求 */ public void doGetAsync(String url, Map headers, Callback callback) { Request.Builder requestBuilder = new Request.Builder().url(url); if (headers != null) { headers.forEach(requestBuilder::addHeader); } Request request = requestBuilder.build(); okHttpClient.newCall(request).enqueue(callback); } /** * 执行 GET 请求,返回字符串(保留原有方法) */ public String doGetAsString(String url, Map headers) throws IOException { Request.Builder requestBuilder = new Request.Builder().url(url); if (headers != null) { headers.forEach(requestBuilder::addHeader); } requestBuilder.addHeader("Content-Type", "application/json"); Request request = requestBuilder.build(); try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code: " + response); } return response.body().string(); } } }