!191 add 新增http代理模式

Merge pull request !191 from Bleachtred/dev-3.0.x
This commit is contained in:
风如歌 2025-03-03 11:16:24 +00:00 committed by Gitee
commit 4e3845e2ce
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
6 changed files with 163 additions and 10 deletions

View File

@ -0,0 +1,27 @@
package org.dromara.sms4j.api.universal;
import lombok.Data;
import java.io.Serializable;
/**
* 短信代理配置类
*/
@Data
public class ProxyConfig implements Serializable {
/**
* 是否启用代理 默认不启用
*/
private Boolean enable = false;
/**
* 代理服务器地址
*/
private String host;
/**
* 代理服务器端口
*/
private Integer port;
}

View File

@ -22,4 +22,9 @@ public interface SupplierConfig {
*/
String getSupplier();
/**
* 获取代理配置
*
*/
ProxyConfig getProxy();
}

View File

@ -1,9 +1,11 @@
package org.dromara.sms4j.comm.utils;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.dromara.sms4j.comm.exception.SmsBlendException;
@ -12,15 +14,108 @@ import java.util.Map;
public class SmsHttpUtils {
/**
* 是否启用代理 默认不启用
*/
private final Boolean enable;
/**
* 代理服务器地址
*/
private final String host;
/**
* 代理服务器端口
*/
private final Integer port;
// 无代理单例饿汉式加载
private static final SmsHttpUtils NON_PROXY_INSTANCE = new SmsHttpUtils();
// 代理单例双重校验锁延迟加载
private static volatile SmsHttpUtils PROXY_INSTANCE;
// 无代理构造方法
private SmsHttpUtils() {
this.enable = false;
this.host = null;
this.port = null;
}
private static class SmsHttpHolder {
private static final SmsHttpUtils INSTANCE = new SmsHttpUtils();
// 代理构造方法
private SmsHttpUtils(String host, Integer port) {
this.enable = true;
this.host = host;
this.port = port;
}
/**
* 获取无代理单例
*/
public static SmsHttpUtils instance() {
return SmsHttpHolder.INSTANCE;
return NON_PROXY_INSTANCE;
}
/**
* 获取代理单例线程安全 + 参数校验
*/
public static SmsHttpUtils instance(String host, Integer port) {
if (PROXY_INSTANCE == null) {
synchronized (SmsHttpUtils.class) {
if (PROXY_INSTANCE == null) {
validateProxyParams(host, port);
PROXY_INSTANCE = new SmsHttpUtils(host, port);
}
}
} else {
// 二次调用时校验参数一致性
if (!PROXY_INSTANCE.host.equals(host) || !PROXY_INSTANCE.port.equals(port)) {
throw new IllegalStateException("Proxy parameters cannot be modified after initialization");
}
}
return PROXY_INSTANCE;
}
// 代理参数校验
private static void validateProxyParams(String host, Integer port) {
if (StrUtil.isBlank(host) || port == null || port <= 0) {
throw new IllegalArgumentException("Invalid proxy host or port");
}
}
/**
* 配置请求 是否走代理
* @param url 请求地址
* @return HttpRequest
*/
private HttpRequest request(String url){
HttpRequest request = HttpRequest.of(url);
if (enable){
request.setHttpProxy(host, port);
}
return request;
}
/**
* 构造post请求
* @param url 请求地址
* @return HttpRequest
*/
private HttpRequest post(String url){
HttpRequest post = request(url);
post.setMethod(Method.POST);
return post;
}
/**
* 构造get请求
* @param url 请求地址
* @return HttpRequest
*/
private HttpRequest get(String url){
HttpRequest get = request(url);
get.setMethod(Method.GET);
return get;
}
/**
@ -32,7 +127,7 @@ public class SmsHttpUtils {
* @return 返回体
*/
public JSONObject postJson(String url, Map<String, String> headers, String body) {
try (HttpResponse response = HttpRequest.post(url)
try (HttpResponse response = post(url)
.addHeaders(headers)
.body(body)
.execute()) {
@ -63,7 +158,7 @@ public class SmsHttpUtils {
* @return 返回体
*/
public JSONObject postFrom(String url, Map<String, String> headers, Map<String, Object> body) {
try (HttpResponse response = HttpRequest.post(url)
try (HttpResponse response = post(url)
.addHeaders(headers)
.form(body)
.execute()) {
@ -84,7 +179,7 @@ public class SmsHttpUtils {
* @return 返回体
*/
public JSONObject postBasicFrom(String url, Map<String, String> headers, String username, String password, Map<String, Object> body) {
try (HttpResponse response = HttpRequest.post(url)
try (HttpResponse response = post(url)
.addHeaders(headers)
.basicAuth(username, password)
.form(body)
@ -105,7 +200,7 @@ public class SmsHttpUtils {
*/
public JSONObject postUrl(String url, Map<String, String> headers, Map<String, Object> params) {
String urlWithParams = url + "?" + URLUtil.buildQuery(params, null);
try (HttpResponse response = HttpRequest.post(urlWithParams)
try (HttpResponse response = post(urlWithParams)
.addHeaders(headers)
.execute()) {
return JSONUtil.parseObj(response.body());
@ -121,7 +216,7 @@ public class SmsHttpUtils {
* @return 返回体
*/
public JSONObject getBasic(String url, String username, String password) {
try (HttpResponse response = HttpRequest.get(url)
try (HttpResponse response = get(url)
.basicAuth(username, password)
.execute()) {
return JSONUtil.parseObj(response.body());
@ -137,7 +232,7 @@ public class SmsHttpUtils {
* @return 返回体
*/
public JSONObject getUrl(String url) {
try (HttpResponse response = HttpRequest.get(url)
try (HttpResponse response = get(url)
.execute()) {
return JSONUtil.parseObj(response.body());
} catch (Exception e) {

View File

@ -1,6 +1,7 @@
package org.dromara.sms4j.provider.config;
import lombok.Data;
import org.dromara.sms4j.api.universal.ProxyConfig;
import org.dromara.sms4j.api.universal.SupplierConfig;
import org.dromara.sms4j.comm.exception.SmsBlendException;
@ -56,6 +57,12 @@ public abstract class BaseConfig implements SupplierConfig {
*/
private String configId;
/**
* 代理配置
*
*/
private ProxyConfig proxy;
/**
* 重试间隔单位默认为5秒
*/

View File

@ -5,6 +5,7 @@ import lombok.Getter;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.callback.CallBack;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.api.universal.ProxyConfig;
import org.dromara.sms4j.api.universal.SupplierConfig;
import org.dromara.sms4j.api.utils.SmsRespUtils;
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
@ -32,13 +33,19 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
protected final DelayedTime delayed;
protected final SmsHttpUtils http = SmsHttpUtils.instance();
protected final SmsHttpUtils http;
protected AbstractSmsBlend(C config, Executor pool, DelayedTime delayed) {
this.configId = StrUtil.isEmpty(config.getConfigId()) ? getSupplier() : config.getConfigId();
this.config = config;
this.pool = pool;
this.delayed = delayed;
ProxyConfig proxy = config.getProxy();
if (proxy != null && proxy.getEnable()){
this.http = SmsHttpUtils.instance(proxy.getHost(), proxy.getPort());
}else {
this.http = SmsHttpUtils.instance();
}
}
protected AbstractSmsBlend(C config) {
@ -46,6 +53,12 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
this.config = config;
this.pool = BeanFactory.getExecutor();
this.delayed = BeanFactory.getDelayedTime();
ProxyConfig proxy = config.getProxy();
if (proxy != null && proxy.getEnable()){
this.http = SmsHttpUtils.instance(proxy.getHost(), proxy.getPort());
}else {
this.http = SmsHttpUtils.instance();
}
}
protected C getConfig() {

View File

@ -18,6 +18,12 @@ sms:
template-id: SMS_272470496
# 模版名称
templateName: code
# 代理
proxy:
# 是否启用代理 默认关闭 需手动开启
enable: true
host: 127.0.0.1
port: 8080
# 腾讯短信例子
tx:
#厂商标识