236 lines
8.8 KiB
Java
236 lines
8.8 KiB
Java
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<String, String> params, @Nullable Map<String, String> headers) {
|
||
// if (url.isEmpty()) {
|
||
// return "url为空";
|
||
// }
|
||
//
|
||
// Request.Builder requestBuilder = new Request.Builder()
|
||
// .url(url)
|
||
// .get();
|
||
//
|
||
// //header
|
||
// if (headers != null) {
|
||
// for (Map.Entry<String, String> 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<String, String> headers) {
|
||
return postJsonString(url, json, headers, StandardCharsets.UTF_8);
|
||
}
|
||
|
||
public @NotNull String postJsonString(@NotNull String url, @Nullable String json, @Nullable Map<String, String> 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<String, String> 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<String, Object> params, @Nullable Map<String, String> headers) {
|
||
return postFormData(url, params, headers, StandardCharsets.UTF_8);
|
||
}
|
||
|
||
public @NotNull String postFormData(@NotNull String url, @Nullable Map<String, Object> params, @Nullable Map<String, String> 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<String, Object> 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<String, String> 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<String, Object> params, @Nullable Map<String, String> headers) {
|
||
return postFormUrlEncoded(url, params, headers, StandardCharsets.UTF_8);
|
||
}
|
||
|
||
public @NotNull String postFormUrlEncoded(@NotNull String url, @Nullable Map<String, Object> params, @Nullable Map<String, String> 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<String, Object> 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<String, String> 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();
|
||
}
|
||
}
|
||
|
||
}
|