From 20f3faf62713ca44568b076fabbc8dbcdc227007 Mon Sep 17 00:00:00 2001 From: zzs Date: Wed, 8 Mar 2017 10:37:43 +0800 Subject: [PATCH] =?UTF-8?q?sorry=EF=BC=8C=E6=96=87=E4=BB=B6=E9=81=97?= =?UTF-8?q?=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/common/http/HttpRequestTemplate.java | 179 ++++++++++++++++++ .../in/egan/pay/common/http/UriVariables.java | 73 +++++++ .../egan/pay/common/util/sign/SignUtils.java | 12 ++ 3 files changed, 264 insertions(+) create mode 100644 pay-java-common/src/main/java/in/egan/pay/common/http/HttpRequestTemplate.java create mode 100644 pay-java-common/src/main/java/in/egan/pay/common/http/UriVariables.java diff --git a/pay-java-common/src/main/java/in/egan/pay/common/http/HttpRequestTemplate.java b/pay-java-common/src/main/java/in/egan/pay/common/http/HttpRequestTemplate.java new file mode 100644 index 0000000..c044e2e --- /dev/null +++ b/pay-java-common/src/main/java/in/egan/pay/common/http/HttpRequestTemplate.java @@ -0,0 +1,179 @@ +package in.egan.pay.common.http; + +import in.egan.pay.common.bean.MethodType; +import in.egan.pay.common.util.str.StringUtils; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +import java.io.IOException; +import java.net.URI; +import java.util.Map; + +/** + * http请求工具 + * @author: egan + * @email egzosn@gmail.com + * @date 2017/3/3 21:33 + */ +public class HttpRequestTemplate { + + protected CloseableHttpClient httpClient; + + protected HttpHost httpProxy; + + public HttpHost getHttpProxy() { + return httpProxy; + } + + public CloseableHttpClient getHttpClient() { + return httpClient; + } + + public HttpRequestTemplate(HttpConfigStorage configStorage) { + setHttpConfigStorage(configStorage); + } + + public HttpRequestTemplate() { + setHttpConfigStorage(null); + } + + public HttpRequestTemplate setHttpConfigStorage(HttpConfigStorage configStorage){ + + if (null == configStorage){ + httpClient = HttpClients.createDefault(); + return this; + } + + + if (StringUtils.isNotBlank(configStorage.getHttpProxyHost())) { + // 使用代理服务器 + if (StringUtils.isNotBlank(configStorage.getHttpProxyUsername())) { + // 需要用户认证的代理服务器 + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort()), + new UsernamePasswordCredentials(configStorage.getHttpProxyUsername(), configStorage.getHttpProxyPassword())); + httpClient = HttpClients + .custom() + .setDefaultCredentialsProvider(credsProvider) + .build(); + } else { + // 无需用户认证的代理服务器 + httpClient = HttpClients.createDefault(); + } + httpProxy = new HttpHost(configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort()); + } else { + httpClient = HttpClients.createDefault(); + } + return this; + } + + + /** + * + * post + * @param uri 请求地址 + * @param request + * @param responseType 为响应类(需要自己依据响应格式来确定) + * @param + * @return + * @throws IOException + */ + public T postForObject(String uri, Object request, Class responseType, Object... uriVariables){ + return doExecute(URI.create(UriVariables.getUri(uri, uriVariables)), request, responseType, MethodType.POST); + } + + public T postForObject(String uri, Object request, Class responseType, Map uriVariables) { + return doExecute(URI.create(UriVariables.getUri(uri, uriVariables)), request, responseType, MethodType.POST); + } + + public T postForObject(URI uri, Object request, Class responseType){ + return doExecute(uri, request, responseType, MethodType.POST); + } + + + + /** + * get 请求 + * @param uri 请求地址 + * @param responseType 响应类型 + * @param uriVariables 用于匹配表达式 + * @param 响应类型 + * @return + * + * + * getForObject("http://egan.in/pay/{id}/f/{type}", String.class, "1", "APP") + * + */ + public T getForObject(String uri, Class responseType, Object... uriVariables){ + + return doExecute(URI.create(UriVariables.getUri(uri, uriVariables)), null, responseType, MethodType.GET); + } + + /** + * get 请求 + * + * @param uri 请求地址 + * @param responseType 响应类型 + * @param uriVariables 用于匹配表达式 + * @param 响应类型 + * @return + * + * Map uriVariables = new HashMap(); + * uriVariables.put("id", "1"); + * uriVariables.put("type", "APP"); + * getForObject("http://egan.in/pay/{id}/f/{type}", String.class, uriVariables) + * + */ + public T getForObject(String uri, Class responseType, Map uriVariables){ + return doExecute(URI.create(UriVariables.getUri(uri, uriVariables)), null, responseType, MethodType.GET); + } + + + /** + * http 请求执行 + * @param uri 地址 + * @param request 请求数据 + * @param responseType 响应类型 + * @param method 请求方法 + * @param + * @return + * @throws IOException + */ + public T doExecute(URI uri, Object request, Class responseType, MethodType method){ + ClientHttpRequest httpRequest = new ClientHttpRequest(uri ,method, request); + httpRequest.setProxy(httpProxy).setResponseType(responseType); + try (CloseableHttpResponse response = httpClient.execute(httpRequest)) { + return httpRequest.handleResponse(response); + }catch ( IOException e){ + e.printStackTrace(); + }finally { + httpRequest.releaseConnection(); + } + return null; + } + + /** + * http 请求执行 + * @param uri 地址 + * @param request 请求数据 + * @param responseType 响应类型 + * @param method 请求方法 + * @param + * @return + * @throws IOException + */ + public T doExecute(String uri, Object request, Class responseType, MethodType method){ + return doExecute(URI.create(uri), request, responseType, method); + } + + + + +} diff --git a/pay-java-common/src/main/java/in/egan/pay/common/http/UriVariables.java b/pay-java-common/src/main/java/in/egan/pay/common/http/UriVariables.java new file mode 100644 index 0000000..074b38b --- /dev/null +++ b/pay-java-common/src/main/java/in/egan/pay/common/http/UriVariables.java @@ -0,0 +1,73 @@ +package in.egan.pay.common.http; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * URL表达式处理器 + * + * @author: egan + * @email egzosn@gmail.com + * @date 2017/3/5 10:07 + */ +public class UriVariables { + + /** + * 依次匹配 + * @param uri + * @param uriVariables + * @return + * + * System.out.println(getUri("http://egan.in/{a}/ba/{a1}?{bb}={a1}", "no1", "no2", "no3", "no4")); + * 结果 http://egan.in/no1/ba/no2?no3=no4 + * + * + */ + public static String getUri(String uri, Object... uriVariables) { + + if (null == uriVariables){ + return uri; + } + for (Object variable : uriVariables){ + if (null == variable){ + continue; + } + uri = uri.replaceFirst("\\{\\w+\\}", variable.toString()); + } + return uri; + } + + /** + * 匹配Map.key + * @param uri + * @param uriVariables + * @return + * + * Map uriVariable = new HashMap<>(); + * uriVariable.put("a", "no1"); + * uriVariable.put("a1", "no2"); + * uriVariable.put("bb", "no3"); + * System.out.println(getUri("http://egan.in/{a}/ba/{a1}?{bb}={a1}", uriVariable)); + * 结果 http://egan.in/no1/ba/no2?no3=no2 + * + */ + public static String getUri(String uri, Map uriVariables) { + + if (null == uriVariables){ + return uri; + } + for (String key : uriVariables.keySet()){ + Object uriVariable = uriVariables.get(key); + if (null == uriVariable){ + continue; + } + + uri = uri.replace("{" + key + "}", uriVariable.toString()); + } + return uri; + } + + +} diff --git a/pay-java-common/src/main/java/in/egan/pay/common/util/sign/SignUtils.java b/pay-java-common/src/main/java/in/egan/pay/common/util/sign/SignUtils.java index f392f19..b1f46d9 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/util/sign/SignUtils.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/util/sign/SignUtils.java @@ -52,6 +52,18 @@ public enum SignUtils { public boolean verify(String text, String sign, String publicKey, String characterEncoding) { return in.egan.pay.common.util.sign.encrypt.RSA.verify(text, sign, publicKey, characterEncoding); } + }, + + RSA2 { + @Override + public String createSign(String content, String key, String characterEncoding) { + return in.egan.pay.common.util.sign.encrypt.RSA2.sign(content, key, characterEncoding); + } + + @Override + public boolean verify(String text, String sign, String publicKey, String characterEncoding) { + return in.egan.pay.common.util.sign.encrypt.RSA2.verify(text, sign, publicKey, characterEncoding); + } }; /**