@@ -1,7 +1,7 @@ | |||||
package me.chanjar.weixin.cp.api; | package me.chanjar.weixin.cp.api; | ||||
import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; | |||||
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||||
import java.io.File; | import java.io.File; | ||||
@@ -2,7 +2,7 @@ package me.chanjar.weixin.cp.api; | |||||
import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
import me.chanjar.weixin.common.util.ToStringUtils; | import me.chanjar.weixin.common.util.ToStringUtils; | ||||
import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; | |||||
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||||
import java.io.File; | import java.io.File; | ||||
@@ -1,7 +1,7 @@ | |||||
package me.chanjar.weixin.cp.api; | package me.chanjar.weixin.cp.api; | ||||
import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; | |||||
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||||
import redis.clients.jedis.Jedis; | import redis.clients.jedis.Jedis; | ||||
import redis.clients.jedis.JedisPool; | import redis.clients.jedis.JedisPool; | ||||
@@ -20,7 +20,7 @@ import java.util.List; | |||||
/** | /** | ||||
* 微信API的Service | * 微信API的Service | ||||
*/ | */ | ||||
public interface WxCpService { | |||||
public interface WxCpService<H, P> { | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
@@ -469,7 +469,7 @@ public interface WxCpService { | |||||
* <pre> | * <pre> | ||||
* Service没有实现某个API的时候,可以用这个, | * Service没有实现某个API的时候,可以用这个, | ||||
* 比{@link #get}和{@link #post}方法更灵活,可以自己构造RequestExecutor用来处理不同的参数和不同的返回类型。 | * 比{@link #get}和{@link #post}方法更灵活,可以自己构造RequestExecutor用来处理不同的参数和不同的返回类型。 | ||||
* 可以参考,{@link me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor}的实现方法 | |||||
* 可以参考,{@link me.chanjar.weixin.common.util.http.jodd.MediaUploadRequestExecutor}的实现方法 | |||||
* </pre> | * </pre> | ||||
* | * | ||||
* @param executor 执行器 | * @param executor 执行器 | ||||
@@ -478,7 +478,9 @@ public interface WxCpService { | |||||
* @param <T> 请求值类型 | * @param <T> 请求值类型 | ||||
* @param <E> 返回值类型 | * @param <E> 返回值类型 | ||||
*/ | */ | ||||
<T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException; | |||||
<T, E> T execute(RequestExecutor<T, H, P, E> executor, String uri, E data) throws WxErrorException; | |||||
<T, E> T executeInternal(RequestExecutor<T, H, P, E> executor, String uri, E data) throws WxErrorException; | |||||
/** | /** | ||||
* 注入 {@link WxCpConfigStorage} 的实现 | * 注入 {@link WxCpConfigStorage} 的实现 | ||||
@@ -1,4 +1,4 @@ | |||||
package me.chanjar.weixin.cp.api; | |||||
package me.chanjar.weixin.cp.api.impl.apache; | |||||
import com.google.gson.*; | import com.google.gson.*; | ||||
import com.google.gson.reflect.TypeToken; | import com.google.gson.reflect.TypeToken; | ||||
@@ -14,8 +14,12 @@ import me.chanjar.weixin.common.session.WxSessionManager; | |||||
import me.chanjar.weixin.common.util.RandomUtils; | import me.chanjar.weixin.common.util.RandomUtils; | ||||
import me.chanjar.weixin.common.util.crypto.SHA1; | import me.chanjar.weixin.common.util.crypto.SHA1; | ||||
import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
import me.chanjar.weixin.common.util.http.*; | |||||
import me.chanjar.weixin.common.util.http.RequestExecutor; | |||||
import me.chanjar.weixin.common.util.http.URIUtil; | |||||
import me.chanjar.weixin.common.util.http.apache.*; | |||||
import me.chanjar.weixin.common.util.json.GsonHelper; | import me.chanjar.weixin.common.util.json.GsonHelper; | ||||
import me.chanjar.weixin.cp.api.WxCpConfigStorage; | |||||
import me.chanjar.weixin.cp.api.WxCpService; | |||||
import me.chanjar.weixin.cp.bean.WxCpDepart; | import me.chanjar.weixin.cp.bean.WxCpDepart; | ||||
import me.chanjar.weixin.cp.bean.WxCpMessage; | import me.chanjar.weixin.cp.bean.WxCpMessage; | ||||
import me.chanjar.weixin.cp.bean.WxCpTag; | import me.chanjar.weixin.cp.bean.WxCpTag; | ||||
@@ -37,7 +41,7 @@ import java.io.InputStream; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.UUID; | import java.util.UUID; | ||||
public class WxCpServiceImpl implements WxCpService { | |||||
public class WxCpServiceImpl implements WxCpService<CloseableHttpClient, HttpHost> { | |||||
protected final Logger log = LoggerFactory.getLogger(WxCpServiceImpl.class); | protected final Logger log = LoggerFactory.getLogger(WxCpServiceImpl.class); | ||||
@@ -534,7 +538,7 @@ public class WxCpServiceImpl implements WxCpService { | |||||
* 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | ||||
*/ | */ | ||||
@Override | @Override | ||||
public <T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException { | |||||
public <T, E> T execute(RequestExecutor<T,CloseableHttpClient, HttpHost, E> executor, String uri, E data) throws WxErrorException { | |||||
int retryTimes = 0; | int retryTimes = 0; | ||||
do { | do { | ||||
try { | try { | ||||
@@ -570,7 +574,7 @@ public class WxCpServiceImpl implements WxCpService { | |||||
throw new RuntimeException("微信服务端异常,超出重试次数"); | throw new RuntimeException("微信服务端异常,超出重试次数"); | ||||
} | } | ||||
protected synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException { | |||||
public synchronized <T, E> T executeInternal(RequestExecutor<T,CloseableHttpClient, HttpHost, E> executor, String uri, E data) throws WxErrorException { | |||||
if (uri.contains("access_token=")) { | if (uri.contains("access_token=")) { | ||||
throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri); | throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri); | ||||
} | } |
@@ -9,6 +9,7 @@ import com.thoughtworks.xstream.XStream; | |||||
import com.thoughtworks.xstream.annotations.XStreamAlias; | import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||
import me.chanjar.weixin.common.util.xml.XStreamInitializer; | import me.chanjar.weixin.common.util.xml.XStreamInitializer; | ||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
public class ApiTestModule implements Module { | public class ApiTestModule implements Module { | ||||
@@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.api; | |||||
import java.util.List; | import java.util.List; | ||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
import org.testng.Assert; | import org.testng.Assert; | ||||
import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
@@ -5,6 +5,7 @@ import java.io.InputStream; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
import org.testng.Assert; | import org.testng.Assert; | ||||
import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
@@ -1,6 +1,7 @@ | |||||
package me.chanjar.weixin.cp.api; | package me.chanjar.weixin.cp.api; | ||||
import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
import me.chanjar.weixin.cp.bean.WxCpTag; | import me.chanjar.weixin.cp.bean.WxCpTag; | ||||
import me.chanjar.weixin.cp.bean.WxCpUser; | import me.chanjar.weixin.cp.bean.WxCpUser; | ||||
import org.testng.Assert; | import org.testng.Assert; | ||||
@@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.api; | |||||
import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
import me.chanjar.weixin.cp.bean.WxCpDepart; | import me.chanjar.weixin.cp.bean.WxCpDepart; | ||||
import me.chanjar.weixin.cp.bean.WxCpUser; | import me.chanjar.weixin.cp.bean.WxCpUser; | ||||
import org.testng.Assert; | import org.testng.Assert; | ||||
@@ -5,6 +5,7 @@ import me.chanjar.weixin.common.api.WxConsts; | |||||
import me.chanjar.weixin.common.bean.menu.WxMenu; | import me.chanjar.weixin.common.bean.menu.WxMenu; | ||||
import me.chanjar.weixin.common.bean.menu.WxMenuButton; | import me.chanjar.weixin.common.bean.menu.WxMenuButton; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
import org.testng.Assert; | import org.testng.Assert; | ||||
import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
@@ -1,7 +1,9 @@ | |||||
package me.chanjar.weixin.cp.api; | |||||
package me.chanjar.weixin.cp.api.impl.apache; | |||||
import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import me.chanjar.weixin.cp.api.ApiTestModule; | |||||
import me.chanjar.weixin.cp.api.WxCpConfigStorage; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.testng.Assert; | import org.testng.Assert; | ||||
import org.testng.annotations.Guice; | import org.testng.annotations.Guice; |
@@ -1,8 +1,11 @@ | |||||
package me.chanjar.weixin.cp.api; | |||||
package me.chanjar.weixin.cp.api.impl.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 me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
import me.chanjar.weixin.cp.api.WxCpService; | |||||
import org.apache.http.HttpHost; | |||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
@@ -19,8 +22,8 @@ public class WxCpBusyRetryTest { | |||||
WxCpService service = new WxCpServiceImpl() { | WxCpService service = new WxCpServiceImpl() { | ||||
@Override | @Override | ||||
protected synchronized <T, E> T executeInternal( | |||||
RequestExecutor<T, E> executor, String uri, E data) | |||||
public synchronized <T, E> T executeInternal( | |||||
RequestExecutor<T,CloseableHttpClient, HttpHost, E> executor, String uri, E data) | |||||
throws WxErrorException { | throws WxErrorException { | ||||
this.log.info("Executed"); | this.log.info("Executed"); | ||||
WxError error = new WxError(); | WxError error = new WxError(); |
@@ -1,13 +1,12 @@ | |||||
package me.chanjar.weixin.cp.api; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
package me.chanjar.weixin.cp.api.impl.apache; | |||||
import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
import me.chanjar.weixin.common.api.WxConsts; | import me.chanjar.weixin.common.api.WxConsts; | ||||
import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
import me.chanjar.weixin.cp.api.ApiTestModule; | |||||
import me.chanjar.weixin.cp.bean.WxCpMessage; | import me.chanjar.weixin.cp.bean.WxCpMessage; | ||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
/*** | /*** | ||||
* 测试发送消息 | * 测试发送消息 |
@@ -13,7 +13,7 @@ import me.chanjar.weixin.cp.api.WxCpConfigStorage; | |||||
import me.chanjar.weixin.cp.api.WxCpMessageHandler; | import me.chanjar.weixin.cp.api.WxCpMessageHandler; | ||||
import me.chanjar.weixin.cp.api.WxCpMessageRouter; | import me.chanjar.weixin.cp.api.WxCpMessageRouter; | ||||
import me.chanjar.weixin.cp.api.WxCpService; | import me.chanjar.weixin.cp.api.WxCpService; | ||||
import me.chanjar.weixin.cp.api.WxCpServiceImpl; | |||||
import me.chanjar.weixin.cp.api.impl.apache.WxCpServiceImpl; | |||||
import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | ||||
import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; | import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; | ||||
import me.chanjar.weixin.cp.bean.WxCpXmlOutTextMessage; | import me.chanjar.weixin.cp.bean.WxCpXmlOutTextMessage; | ||||
@@ -3,9 +3,9 @@ | |||||
<suite name="Weixin-java-tool-suite" verbose="1"> | <suite name="Weixin-java-tool-suite" verbose="1"> | ||||
<test name="API_Test"> | <test name="API_Test"> | ||||
<classes> | <classes> | ||||
<class name="me.chanjar.weixin.cp.api.WxCpBusyRetryTest"/> | |||||
<class name="me.chanjar.weixin.cp.api.WxCpBaseAPITest"/> | |||||
<class name="me.chanjar.weixin.cp.api.WxCpMessageAPITest"/> | |||||
<class name="me.chanjar.weixin.cp.api.impl.apache.WxCpBusyRetryTest"/> | |||||
<class name="me.chanjar.weixin.cp.api.impl.apache.WxCpBaseAPITest"/> | |||||
<class name="me.chanjar.weixin.cp.api.impl.apache.WxCpMessageAPITest"/> | |||||
<class name="me.chanjar.weixin.cp.api.WxMenuAPITest"/> | <class name="me.chanjar.weixin.cp.api.WxMenuAPITest"/> | ||||
<class name="me.chanjar.weixin.cp.api.WxCpDepartAPITest"/> | <class name="me.chanjar.weixin.cp.api.WxCpDepartAPITest"/> | ||||
<class name="me.chanjar.weixin.cp.api.WxCpMediaAPITest"/> | <class name="me.chanjar.weixin.cp.api.WxCpMediaAPITest"/> | ||||