mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-05-07 06:07:47 +08:00
common usage jodd-http
This commit is contained in:
parent
d476047c4c
commit
0b0b5a90fc
@ -1,292 +0,0 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.http.annotation.NotThreadSafe;
|
|
||||||
import org.apache.http.auth.AuthScope;
|
|
||||||
import org.apache.http.auth.UsernamePasswordCredentials;
|
|
||||||
import org.apache.http.client.CredentialsProvider;
|
|
||||||
import org.apache.http.client.HttpRequestRetryHandler;
|
|
||||||
import org.apache.http.client.config.RequestConfig;
|
|
||||||
import org.apache.http.config.Registry;
|
|
||||||
import org.apache.http.config.RegistryBuilder;
|
|
||||||
import org.apache.http.config.SocketConfig;
|
|
||||||
import org.apache.http.conn.HttpClientConnectionManager;
|
|
||||||
import org.apache.http.conn.socket.ConnectionSocketFactory;
|
|
||||||
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
|
|
||||||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
|
||||||
import org.apache.http.impl.client.BasicCredentialsProvider;
|
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
|
||||||
import org.apache.http.impl.client.HttpClients;
|
|
||||||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
|
||||||
import org.apache.http.protocol.HttpContext;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* httpclient 连接管理器
|
|
||||||
*
|
|
||||||
* @author kakotor
|
|
||||||
*/
|
|
||||||
@NotThreadSafe
|
|
||||||
public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
|
|
||||||
protected final Logger log = LoggerFactory.getLogger(DefaultApacheHttpClientBuilder.class);
|
|
||||||
private final AtomicBoolean prepared = new AtomicBoolean(false);
|
|
||||||
private int connectionRequestTimeout = 3000;
|
|
||||||
private int connectionTimeout = 5000;
|
|
||||||
private int soTimeout = 5000;
|
|
||||||
private int idleConnTimeout = 60000;
|
|
||||||
private int checkWaitTime = 60000;
|
|
||||||
private int maxConnPerHost = 10;
|
|
||||||
private int maxTotalConn = 50;
|
|
||||||
private String userAgent;
|
|
||||||
private HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
|
|
||||||
@Override
|
|
||||||
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
|
|
||||||
private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
|
|
||||||
private String httpProxyHost;
|
|
||||||
private int httpProxyPort;
|
|
||||||
private String httpProxyUsername;
|
|
||||||
private String httpProxyPassword;
|
|
||||||
/**
|
|
||||||
* 闲置连接监控线程
|
|
||||||
*/
|
|
||||||
private IdleConnectionMonitorThread idleConnectionMonitorThread;
|
|
||||||
private HttpClientBuilder httpClientBuilder;
|
|
||||||
|
|
||||||
private DefaultApacheHttpClientBuilder() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DefaultApacheHttpClientBuilder get() {
|
|
||||||
return new DefaultApacheHttpClientBuilder();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApacheHttpClientBuilder httpProxyHost(String httpProxyHost) {
|
|
||||||
this.httpProxyHost = httpProxyHost;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApacheHttpClientBuilder httpProxyPort(int httpProxyPort) {
|
|
||||||
this.httpProxyPort = httpProxyPort;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApacheHttpClientBuilder httpProxyUsername(String httpProxyUsername) {
|
|
||||||
this.httpProxyUsername = httpProxyUsername;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApacheHttpClientBuilder httpProxyPassword(String httpProxyPassword) {
|
|
||||||
this.httpProxyPassword = httpProxyPassword;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory) {
|
|
||||||
this.sslConnectionSocketFactory = sslConnectionSocketFactory;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取链接的超时时间设置,默认3000ms
|
|
||||||
* <p>
|
|
||||||
* 设置为零时不超时,一直等待.
|
|
||||||
* 设置为负数是使用系统默认设置(非上述的3000ms的默认值,而是httpclient的默认设置).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param connectionRequestTimeout 获取链接的超时时间设置(单位毫秒),默认3000ms
|
|
||||||
*/
|
|
||||||
public void setConnectionRequestTimeout(int connectionRequestTimeout) {
|
|
||||||
this.connectionRequestTimeout = connectionRequestTimeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 建立链接的超时时间,默认为5000ms.由于是在链接池获取链接,此设置应该并不起什么作用
|
|
||||||
* <p>
|
|
||||||
* 设置为零时不超时,一直等待.
|
|
||||||
* 设置为负数是使用系统默认设置(非上述的5000ms的默认值,而是httpclient的默认设置).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param connectionTimeout 建立链接的超时时间设置(单位毫秒),默认5000ms
|
|
||||||
*/
|
|
||||||
public void setConnectionTimeout(int connectionTimeout) {
|
|
||||||
this.connectionTimeout = connectionTimeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 默认NIO的socket超时设置,默认5000ms.
|
|
||||||
*
|
|
||||||
* @param soTimeout 默认NIO的socket超时设置,默认5000ms.
|
|
||||||
* @see java.net.SocketOptions#SO_TIMEOUT
|
|
||||||
*/
|
|
||||||
public void setSoTimeout(int soTimeout) {
|
|
||||||
this.soTimeout = soTimeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 空闲链接的超时时间,默认60000ms.
|
|
||||||
* <p>
|
|
||||||
* 超时的链接将在下一次空闲链接检查是被销毁
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param idleConnTimeout 空闲链接的超时时间,默认60000ms.
|
|
||||||
*/
|
|
||||||
public void setIdleConnTimeout(int idleConnTimeout) {
|
|
||||||
this.idleConnTimeout = idleConnTimeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 检查空间链接的间隔周期,默认60000ms.
|
|
||||||
*
|
|
||||||
* @param checkWaitTime 检查空间链接的间隔周期,默认60000ms.
|
|
||||||
*/
|
|
||||||
public void setCheckWaitTime(int checkWaitTime) {
|
|
||||||
this.checkWaitTime = checkWaitTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 每路的最大链接数,默认10
|
|
||||||
*
|
|
||||||
* @param maxConnPerHost 每路的最大链接数,默认10
|
|
||||||
*/
|
|
||||||
public void setMaxConnPerHost(int maxConnPerHost) {
|
|
||||||
this.maxConnPerHost = maxConnPerHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 最大总连接数,默认50
|
|
||||||
*
|
|
||||||
* @param maxTotalConn 最大总连接数,默认50
|
|
||||||
*/
|
|
||||||
public void setMaxTotalConn(int maxTotalConn) {
|
|
||||||
this.maxTotalConn = maxTotalConn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自定义httpclient的User Agent
|
|
||||||
*
|
|
||||||
* @param userAgent User Agent
|
|
||||||
*/
|
|
||||||
public void setUserAgent(String userAgent) {
|
|
||||||
this.userAgent = userAgent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IdleConnectionMonitorThread getIdleConnectionMonitorThread() {
|
|
||||||
return this.idleConnectionMonitorThread;
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void prepare() {
|
|
||||||
if(prepared.get()){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
|
|
||||||
.register("http", this.plainConnectionSocketFactory)
|
|
||||||
.register("https", this.sslConnectionSocketFactory)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
@SuppressWarnings("resource")
|
|
||||||
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
|
|
||||||
connectionManager.setMaxTotal(this.maxTotalConn);
|
|
||||||
connectionManager.setDefaultMaxPerRoute(this.maxConnPerHost);
|
|
||||||
connectionManager.setDefaultSocketConfig(
|
|
||||||
SocketConfig.copy(SocketConfig.DEFAULT)
|
|
||||||
.setSoTimeout(this.soTimeout)
|
|
||||||
.build()
|
|
||||||
);
|
|
||||||
|
|
||||||
this.idleConnectionMonitorThread = new IdleConnectionMonitorThread(
|
|
||||||
connectionManager, this.idleConnTimeout, this.checkWaitTime);
|
|
||||||
this.idleConnectionMonitorThread.setDaemon(true);
|
|
||||||
this.idleConnectionMonitorThread.start();
|
|
||||||
|
|
||||||
this.httpClientBuilder = HttpClients.custom()
|
|
||||||
.setConnectionManager(connectionManager)
|
|
||||||
.setConnectionManagerShared(true)
|
|
||||||
.setDefaultRequestConfig(
|
|
||||||
RequestConfig.custom()
|
|
||||||
.setSocketTimeout(this.soTimeout)
|
|
||||||
.setConnectTimeout(this.connectionTimeout)
|
|
||||||
.setConnectionRequestTimeout(this.connectionRequestTimeout)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
.setRetryHandler(this.httpRequestRetryHandler);
|
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(this.httpProxyHost)
|
|
||||||
&& StringUtils.isNotBlank(this.httpProxyUsername)) {
|
|
||||||
// 使用代理服务器 需要用户认证的代理服务器
|
|
||||||
CredentialsProvider provider = new BasicCredentialsProvider();
|
|
||||||
provider.setCredentials(
|
|
||||||
new AuthScope(this.httpProxyHost, this.httpProxyPort),
|
|
||||||
new UsernamePasswordCredentials(this.httpProxyUsername,
|
|
||||||
this.httpProxyPassword));
|
|
||||||
this.httpClientBuilder.setDefaultCredentialsProvider(provider);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(this.userAgent)) {
|
|
||||||
this.httpClientBuilder.setUserAgent(this.userAgent);
|
|
||||||
}
|
|
||||||
prepared.set(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CloseableHttpClient build() {
|
|
||||||
if(!prepared.get()){
|
|
||||||
prepare();
|
|
||||||
}
|
|
||||||
return this.httpClientBuilder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class IdleConnectionMonitorThread extends Thread {
|
|
||||||
private final HttpClientConnectionManager connMgr;
|
|
||||||
private final int idleConnTimeout;
|
|
||||||
private final int checkWaitTime;
|
|
||||||
private volatile boolean shutdown;
|
|
||||||
|
|
||||||
public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr, int idleConnTimeout, int checkWaitTime) {
|
|
||||||
super("IdleConnectionMonitorThread");
|
|
||||||
this.connMgr = connMgr;
|
|
||||||
this.idleConnTimeout = idleConnTimeout;
|
|
||||||
this.checkWaitTime = checkWaitTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
while (!this.shutdown) {
|
|
||||||
synchronized (this) {
|
|
||||||
wait(this.checkWaitTime);
|
|
||||||
this.connMgr.closeExpiredConnections();
|
|
||||||
this.connMgr.closeIdleConnections(this.idleConnTimeout,
|
|
||||||
TimeUnit.MILLISECONDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (InterruptedException ignore) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void trigger() {
|
|
||||||
synchronized (this) {
|
|
||||||
notifyAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void shutdown() {
|
|
||||||
this.shutdown = true;
|
|
||||||
synchronized (this) {
|
|
||||||
notifyAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
|
||||||
|
|
||||||
import org.apache.http.HttpEntity;
|
|
||||||
import org.apache.http.HttpResponse;
|
|
||||||
import org.apache.http.StatusLine;
|
|
||||||
import org.apache.http.client.HttpResponseException;
|
|
||||||
import org.apache.http.client.ResponseHandler;
|
|
||||||
import org.apache.http.util.EntityUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
public class InputStreamResponseHandler implements ResponseHandler<InputStream> {
|
|
||||||
|
|
||||||
public static final ResponseHandler<InputStream> INSTANCE = new InputStreamResponseHandler();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InputStream handleResponse(final HttpResponse response) throws IOException {
|
|
||||||
final StatusLine statusLine = response.getStatusLine();
|
|
||||||
final HttpEntity entity = response.getEntity();
|
|
||||||
if (statusLine.getStatusCode() >= 300) {
|
|
||||||
EntityUtils.consume(entity);
|
|
||||||
throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
|
|
||||||
}
|
|
||||||
return entity == null ? null : entity.getContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,8 +1,6 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
package me.chanjar.weixin.common.util.http;
|
||||||
|
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
import org.apache.http.HttpHost;
|
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -12,16 +10,16 @@ import java.io.IOException;
|
|||||||
* @param <T> 返回值类型
|
* @param <T> 返回值类型
|
||||||
* @param <E> 请求参数类型
|
* @param <E> 请求参数类型
|
||||||
*/
|
*/
|
||||||
public interface RequestExecutor<T, E> {
|
public interface RequestExecutor<T, H, P, E> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param httpclient 传入的httpClient
|
* @param httpClient
|
||||||
* @param httpProxy http代理对象,如果没有配置代理则为空
|
* @param httpProxy http代理对象,如果没有配置代理则为空
|
||||||
* @param uri uri
|
* @param uri uri
|
||||||
* @param data 数据
|
* @param data 数据
|
||||||
* @throws WxErrorException
|
* @throws WxErrorException
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
T execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, E data) throws WxErrorException, IOException;
|
T execute(H httpClient, P httpProxy, String uri, E data) throws WxErrorException, IOException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
|
||||||
|
|
||||||
import org.apache.http.Consts;
|
|
||||||
import org.apache.http.HttpEntity;
|
|
||||||
import org.apache.http.HttpResponse;
|
|
||||||
import org.apache.http.StatusLine;
|
|
||||||
import org.apache.http.client.HttpResponseException;
|
|
||||||
import org.apache.http.client.ResponseHandler;
|
|
||||||
import org.apache.http.util.EntityUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* copy from {@link org.apache.http.impl.client.BasicResponseHandler}
|
|
||||||
*
|
|
||||||
* @author Daniel Qian
|
|
||||||
*/
|
|
||||||
public class Utf8ResponseHandler implements ResponseHandler<String> {
|
|
||||||
|
|
||||||
public static final ResponseHandler<String> INSTANCE = new Utf8ResponseHandler();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String handleResponse(final HttpResponse response) throws IOException {
|
|
||||||
final StatusLine statusLine = response.getStatusLine();
|
|
||||||
final HttpEntity entity = response.getEntity();
|
|
||||||
if (statusLine.getStatusCode() >= 300) {
|
|
||||||
EntityUtils.consume(entity);
|
|
||||||
throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
|
|
||||||
}
|
|
||||||
return entity == null ? null : EntityUtils.toString(entity, Consts.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
@ -1,4 +1,4 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.http.annotation.NotThreadSafe;
|
import org.apache.http.annotation.NotThreadSafe;
|
@ -1,4 +1,4 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import org.apache.http.HttpEntity;
|
import org.apache.http.HttpEntity;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
@ -1,8 +1,9 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
import me.chanjar.weixin.common.util.fs.FileUtils;
|
import me.chanjar.weixin.common.util.fs.FileUtils;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.http.Header;
|
import org.apache.http.Header;
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
@ -23,7 +24,7 @@ import java.util.regex.Pattern;
|
|||||||
* 视频文件不支持下载
|
* 视频文件不支持下载
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class MediaDownloadRequestExecutor implements RequestExecutor<File, String> {
|
public class MediaDownloadRequestExecutor implements RequestExecutor<File, CloseableHttpClient, HttpHost,String> {
|
||||||
|
|
||||||
private File tmpDirFile;
|
private File tmpDirFile;
|
||||||
|
|
@ -1,8 +1,9 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
import org.apache.http.HttpEntity;
|
import org.apache.http.HttpEntity;
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.apache.http.client.config.RequestConfig;
|
import org.apache.http.client.config.RequestConfig;
|
||||||
@ -21,7 +22,7 @@ import java.io.IOException;
|
|||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, File> {
|
public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, CloseableHttpClient, HttpHost,File> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WxMediaUploadResult execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, File file) throws WxErrorException, IOException {
|
public WxMediaUploadResult execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, File file) throws WxErrorException, IOException {
|
@ -1,7 +1,8 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.apache.http.client.config.RequestConfig;
|
import org.apache.http.client.config.RequestConfig;
|
||||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
@ -15,7 +16,7 @@ import java.io.IOException;
|
|||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class SimpleGetRequestExecutor implements RequestExecutor<String, String> {
|
public class SimpleGetRequestExecutor implements RequestExecutor<String, CloseableHttpClient, HttpHost, String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String queryParam) throws WxErrorException, IOException {
|
public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String queryParam) throws WxErrorException, IOException {
|
@ -1,7 +1,8 @@
|
|||||||
package me.chanjar.weixin.common.util.http;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
import org.apache.http.Consts;
|
import org.apache.http.Consts;
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.apache.http.client.config.RequestConfig;
|
import org.apache.http.client.config.RequestConfig;
|
||||||
@ -10,15 +11,14 @@ import org.apache.http.client.methods.HttpPost;
|
|||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import java.io.IOException;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 简单的POST请求执行器,请求的参数是String, 返回的结果也是String
|
* 简单的POST请求执行器,请求的参数是String, 返回的结果也是String
|
||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class SimplePostRequestExecutor implements RequestExecutor<String, String> {
|
public class SimplePostRequestExecutor implements RequestExecutor<String, CloseableHttpClient, HttpHost, String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String postEntity) throws WxErrorException, IOException {
|
public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String postEntity) throws WxErrorException, IOException {
|
@ -1,4 +1,4 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.apache;
|
||||||
|
|
||||||
import org.apache.http.Consts;
|
import org.apache.http.Consts;
|
||||||
import org.apache.http.HttpEntity;
|
import org.apache.http.HttpEntity;
|
@ -1,53 +0,0 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
|
||||||
|
|
||||||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* httpclient build interface
|
|
||||||
* @author kakotor
|
|
||||||
*/
|
|
||||||
public interface ApacheHttpClientBuilder {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 构建httpclient实例
|
|
||||||
*
|
|
||||||
* @return new instance of CloseableHttpClient
|
|
||||||
*/
|
|
||||||
CloseableHttpClient build();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 代理服务器地址
|
|
||||||
*
|
|
||||||
* @param httpProxyHost
|
|
||||||
*/
|
|
||||||
ApacheHttpClientBuilder httpProxyHost(String httpProxyHost);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 代理服务器端口
|
|
||||||
*
|
|
||||||
* @param httpProxyPort
|
|
||||||
*/
|
|
||||||
ApacheHttpClientBuilder httpProxyPort(int httpProxyPort);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 代理服务器用户名
|
|
||||||
*
|
|
||||||
* @param httpProxyUsername
|
|
||||||
*/
|
|
||||||
ApacheHttpClientBuilder httpProxyUsername(String httpProxyUsername);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 代理服务器密码
|
|
||||||
*
|
|
||||||
* @param httpProxyPassword
|
|
||||||
*/
|
|
||||||
ApacheHttpClientBuilder httpProxyPassword(String httpProxyPassword);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ssl连接socket工厂
|
|
||||||
*
|
|
||||||
* @param sslConnectionSocketFactory
|
|
||||||
*/
|
|
||||||
ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory);
|
|
||||||
}
|
|
@ -1,11 +1,13 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.jodd;
|
||||||
|
|
||||||
|
import jodd.http.HttpConnectionProvider;
|
||||||
import jodd.http.HttpRequest;
|
import jodd.http.HttpRequest;
|
||||||
import jodd.http.HttpResponse;
|
import jodd.http.HttpResponse;
|
||||||
import jodd.http.ProxyInfo;
|
import jodd.http.ProxyInfo;
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
import me.chanjar.weixin.common.util.fs.FileUtils;
|
import me.chanjar.weixin.common.util.fs.FileUtils;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
@ -21,7 +23,7 @@ import java.util.regex.Pattern;
|
|||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class MediaDownloadRequestExecutor implements RequestExecutor<File, String> {
|
public class MediaDownloadRequestExecutor implements RequestExecutor<File, HttpConnectionProvider, ProxyInfo, String> {
|
||||||
|
|
||||||
private File tmpDirFile;
|
private File tmpDirFile;
|
||||||
|
|
||||||
@ -33,7 +35,7 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public File execute(ProxyInfo httpProxy, String uri, String queryParam) throws WxErrorException, IOException {
|
public File execute(HttpConnectionProvider provider, ProxyInfo httpProxy, String uri, String queryParam) throws WxErrorException, IOException {
|
||||||
if (queryParam != null) {
|
if (queryParam != null) {
|
||||||
if (uri.indexOf('?') == -1) {
|
if (uri.indexOf('?') == -1) {
|
||||||
uri += '?';
|
uri += '?';
|
||||||
@ -41,8 +43,12 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin
|
|||||||
uri += uri.endsWith("?") ? queryParam : '&' + queryParam;
|
uri += uri.endsWith("?") ? queryParam : '&' + queryParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpRequest httpRequest = HttpRequest.post(uri);
|
HttpRequest request = HttpRequest.post(uri);
|
||||||
HttpResponse response = httpRequest.send();
|
if (httpProxy != null) {
|
||||||
|
provider.useProxy(httpProxy);
|
||||||
|
}
|
||||||
|
request.withConnectionProvider(provider);
|
||||||
|
HttpResponse response = request.send();
|
||||||
String contentType = response.header("Content-Type");
|
String contentType = response.header("Content-Type");
|
||||||
if (contentType != null && contentType.startsWith("application/json")) {
|
if (contentType != null && contentType.startsWith("application/json")) {
|
||||||
// application/json; encoding=utf-8 下载媒体文件出错
|
// application/json; encoding=utf-8 下载媒体文件出错
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.jodd;
|
||||||
|
|
||||||
|
import jodd.http.HttpConnectionProvider;
|
||||||
import jodd.http.HttpRequest;
|
import jodd.http.HttpRequest;
|
||||||
import jodd.http.HttpResponse;
|
import jodd.http.HttpResponse;
|
||||||
import jodd.http.ProxyInfo;
|
import jodd.http.ProxyInfo;
|
||||||
import jodd.http.net.SocketHttpConnectionProvider;
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -16,16 +17,15 @@ import java.io.IOException;
|
|||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, File> {
|
public class MediaUploadRequestExecutor implements RequestExecutor<WxMediaUploadResult, HttpConnectionProvider, ProxyInfo, File> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WxMediaUploadResult execute(ProxyInfo httpProxy, String uri, File file) throws WxErrorException, IOException {
|
public WxMediaUploadResult execute(HttpConnectionProvider provider, ProxyInfo httpProxy, String uri, File file) throws WxErrorException, IOException {
|
||||||
HttpRequest request = HttpRequest.post(uri);
|
HttpRequest request = HttpRequest.post(uri);
|
||||||
if (httpProxy != null) {
|
if (httpProxy != null) {
|
||||||
SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
|
|
||||||
provider.useProxy(httpProxy);
|
provider.useProxy(httpProxy);
|
||||||
request.withConnectionProvider(provider);
|
|
||||||
}
|
}
|
||||||
|
request.withConnectionProvider(provider);
|
||||||
request.form("media", file);
|
request.form("media", file);
|
||||||
HttpResponse response = request.send();
|
HttpResponse response = request.send();
|
||||||
String responseContent =response.bodyText();
|
String responseContent =response.bodyText();
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
|
||||||
|
|
||||||
import jodd.http.ProxyInfo;
|
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* http请求执行器
|
|
||||||
*
|
|
||||||
* @param <T> 返回值类型
|
|
||||||
* @param <E> 请求参数类型
|
|
||||||
*/
|
|
||||||
public interface RequestExecutor<T, E> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param httpProxy http代理对象,如果没有配置代理则为空
|
|
||||||
* @param uri uri
|
|
||||||
* @param data 数据
|
|
||||||
* @throws WxErrorException
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
T execute(ProxyInfo httpProxy, String uri, E data) throws WxErrorException, IOException;
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +1,12 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.jodd;
|
||||||
|
|
||||||
|
import jodd.http.HttpConnectionProvider;
|
||||||
import jodd.http.HttpRequest;
|
import jodd.http.HttpRequest;
|
||||||
import jodd.http.HttpResponse;
|
import jodd.http.HttpResponse;
|
||||||
import jodd.http.ProxyInfo;
|
import jodd.http.ProxyInfo;
|
||||||
import jodd.http.net.SocketHttpConnectionProvider;
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -14,10 +15,10 @@ import java.io.IOException;
|
|||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class SimpleGetRequestExecutor implements RequestExecutor<String, String> {
|
public class SimpleGetRequestExecutor implements RequestExecutor<String, HttpConnectionProvider, ProxyInfo, String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String execute(ProxyInfo httpProxy, String uri, String queryParam) throws WxErrorException, IOException {
|
public String execute(HttpConnectionProvider provider, ProxyInfo httpProxy, String uri, String queryParam) throws WxErrorException, IOException {
|
||||||
if (queryParam != null) {
|
if (queryParam != null) {
|
||||||
if (uri.indexOf('?') == -1) {
|
if (uri.indexOf('?') == -1) {
|
||||||
uri += '?';
|
uri += '?';
|
||||||
@ -27,10 +28,9 @@ public class SimpleGetRequestExecutor implements RequestExecutor<String, String>
|
|||||||
|
|
||||||
HttpRequest request = HttpRequest.get(uri);
|
HttpRequest request = HttpRequest.get(uri);
|
||||||
if (httpProxy != null) {
|
if (httpProxy != null) {
|
||||||
SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
|
|
||||||
provider.useProxy(httpProxy);
|
provider.useProxy(httpProxy);
|
||||||
request.withConnectionProvider(provider);
|
|
||||||
}
|
}
|
||||||
|
request.withConnectionProvider(provider);
|
||||||
HttpResponse response = request.send();
|
HttpResponse response = request.send();
|
||||||
String responseContent = response.bodyText();
|
String responseContent = response.bodyText();
|
||||||
WxError error = WxError.fromJson(responseContent);
|
WxError error = WxError.fromJson(responseContent);
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
package me.chanjar.weixin.common.util.http.jodd;
|
||||||
|
|
||||||
|
import jodd.http.HttpConnectionProvider;
|
||||||
import jodd.http.HttpRequest;
|
import jodd.http.HttpRequest;
|
||||||
import jodd.http.HttpResponse;
|
import jodd.http.HttpResponse;
|
||||||
import jodd.http.ProxyInfo;
|
import jodd.http.ProxyInfo;
|
||||||
import jodd.http.net.SocketHttpConnectionProvider;
|
|
||||||
import me.chanjar.weixin.common.bean.result.WxError;
|
import me.chanjar.weixin.common.bean.result.WxError;
|
||||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||||
|
import me.chanjar.weixin.common.util.http.RequestExecutor;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -14,16 +15,15 @@ import java.io.IOException;
|
|||||||
*
|
*
|
||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class SimplePostRequestExecutor implements RequestExecutor<String, String> {
|
public class SimplePostRequestExecutor implements RequestExecutor<String, HttpConnectionProvider, ProxyInfo, String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String execute(ProxyInfo httpProxy, String uri, String postEntity) throws WxErrorException, IOException {
|
public String execute(HttpConnectionProvider provider, ProxyInfo httpProxy, String uri, String postEntity) throws WxErrorException, IOException {
|
||||||
HttpRequest request = HttpRequest.post(uri);
|
HttpRequest request = HttpRequest.post(uri);
|
||||||
if (httpProxy != null) {
|
if (httpProxy != null) {
|
||||||
SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
|
|
||||||
provider.useProxy(httpProxy);
|
provider.useProxy(httpProxy);
|
||||||
request.withConnectionProvider(provider);
|
|
||||||
}
|
}
|
||||||
|
request.withConnectionProvider(provider);
|
||||||
if (postEntity != null) {
|
if (postEntity != null) {
|
||||||
request.bodyText(postEntity);
|
request.bodyText(postEntity);
|
||||||
}
|
}
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
package me.chanjar.weixin.common.util.http.jodd;
|
|
||||||
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
|
|
||||||
public class URIUtil {
|
|
||||||
|
|
||||||
private static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";
|
|
||||||
|
|
||||||
public static String encodeURIComponent(String input) {
|
|
||||||
if (StringUtils.isEmpty(input)) {
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
int l = input.length();
|
|
||||||
StringBuilder o = new StringBuilder(l * 3);
|
|
||||||
try {
|
|
||||||
for (int i = 0; i < l; i++) {
|
|
||||||
String e = input.substring(i, i + 1);
|
|
||||||
if (ALLOWED_CHARS.indexOf(e) == -1) {
|
|
||||||
byte[] b = e.getBytes("utf-8");
|
|
||||||
o.append(getHex(b));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
o.append(e);
|
|
||||||
}
|
|
||||||
return o.toString();
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getHex(byte buf[]) {
|
|
||||||
StringBuilder o = new StringBuilder(buf.length * 3);
|
|
||||||
for (int i = 0; i < buf.length; i++) {
|
|
||||||
int n = buf[i] & 0xff;
|
|
||||||
o.append("%");
|
|
||||||
if (n < 0x10) {
|
|
||||||
o.append("0");
|
|
||||||
}
|
|
||||||
o.append(Long.toString(n, 16).toUpperCase());
|
|
||||||
}
|
|
||||||
return o.toString();
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user