diff --git a/src/sc545/pay/utils/HttpUtils.java b/src/sc545/pay/utils/HttpUtils.java new file mode 100644 index 0000000..d96fdcf --- /dev/null +++ b/src/sc545/pay/utils/HttpUtils.java @@ -0,0 +1,658 @@ +package sc545.pay.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.CookieStore; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +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.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.TrustStrategy; +import org.apache.http.util.EntityUtils; + + +/** + * 基于 httpclient 4.5版本的 http工具类 + * + * + */ +public class HttpUtils { + + private static final CloseableHttpClient httpClient; + public static final String CHARSET = "UTF-8"; + // 采用静态代码块,初始化超时时间配置,再根据配置生成默认httpClient对象 + static { + //10秒相应超时 + RequestConfig config = RequestConfig.custom().setConnectTimeout(10000).setSocketTimeout(10000).setConnectionRequestTimeout(5000).build(); + httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + } + + public static String doGet(String url, Map params) { + return doGet(url, params, CHARSET); + } + + public static String doGetSSL(String url, Map params) { + return doGetSSL(url, params, CHARSET); + } + + public static String doPost(String url, Map params){ + return doPost(url, params, CHARSET); + } + + /** + * HTTP Get 获取内容 + * @param url 请求的url地址 ?之前的地址 + * @param params 请求的参数 + * @param charset 编码格式 + * @return 页面内容 + */ + public static String doGet(String url, Map params, String charset) { + if(charset==null||charset.trim().length()<1) charset="UTF-8"; + if (StringUtils.isBlank(url)) { + return null; + } + CloseableHttpResponse response = null; + HttpGet httpGet = null; + try { + if (params != null && !params.isEmpty()) { + List pairs = new ArrayList(params.size()); + for (Map.Entry entry : params.entrySet()) { + String value = entry.getValue(); + if (value != null) { + pairs.add(new BasicNameValuePair(entry.getKey(), value)); + } + } + // 将请求参数和url进行拼接 + url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset)); + } + httpGet = new HttpGet(url); + response = httpClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + httpGet.abort(); + throw new RuntimeException("HttpClient,error status code :" + statusCode); + } + HttpEntity entity = response.getEntity(); + String result = null; + if (entity != null) { + result = EntityUtils.toString(entity, charset); + } + EntityUtils.consume(entity); + response.close(); + if(!"UTF-8".equals(getEncoding(result))) result=GBKtoUTF8(result); + + return result; + } catch (Exception e) { + System.out.println("url错误:::"+e.toString()); + try { + response.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + }finally{ + try { + response.close(); + httpClient.close(); + httpGet.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + /** + * HTTP Post 获取内容 + * @param url 请求的url地址 ?之前的地址 + * @param params 请求的参数 + * @param charset 编码格式 + * @return 页面内容 + * @throws IOException + */ + public static String doPost(String url, Map params, String charset) { + if(charset==null||charset.trim().length()<1) charset="UTF-8"; + if (StringUtils.isBlank(url)) { + return null; + } + + List pairs = null; + if (params != null && !params.isEmpty()) { + pairs = new ArrayList(params.size()); + for (Map.Entry entry : params.entrySet()) { + String value = entry.getValue(); + if (value != null) { + pairs.add(new BasicNameValuePair(entry.getKey(), value)); + } + } + } + HttpPost httpPost = new HttpPost(url); + CloseableHttpResponse response = null; + try { + if (pairs != null && pairs.size() > 0) { + httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET)); + } + + response = httpClient.execute(httpPost); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + httpPost.abort(); + throw new RuntimeException("HttpClient,error status code :" + statusCode); + } + HttpEntity entity = response.getEntity(); + String result = null; + if (entity != null) { + result = EntityUtils.toString(entity, charset); + } + EntityUtils.consume(entity); + if(!"UTF-8".equals(getEncoding(result))) result=GBKtoUTF8(result); + return result; + }catch (Exception e) { + System.out.println("url错误:::"+e.toString()); + e.printStackTrace(); + }finally{ + try { + response.close(); + httpClient.close(); + httpPost.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * HTTPS Get 获取内容 + * @param url 请求的url地址 ?之前的地址 + * @param params 请求的参数 + * @param charset 编码格式 + * @return 页面内容 + */ + public static String doGetSSL(String url, Map params, String charset) { + if(charset==null||charset.trim().length()<1) charset="UTF-8"; + if (StringUtils.isBlank(url)) { + return null; + } + CloseableHttpResponse response = null; + HttpGet httpGet = null; + CloseableHttpClient httpsClient = null; + try { + if (params != null && !params.isEmpty()) { + List pairs = new ArrayList(params.size()); + for (Map.Entry entry : params.entrySet()) { + String value = entry.getValue(); + if (value != null) { + pairs.add(new BasicNameValuePair(entry.getKey(), value)); + } + } + url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset)); + } + httpGet = new HttpGet(url); + + // https 注意这里获取https内容,使用了忽略证书的方式,当然还有其他的方式来获取https内容 + httpsClient = HttpUtils.createSSLClientDefault(); + response = httpsClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + httpGet.abort(); + throw new RuntimeException("HttpClient,error status code :" + statusCode); + } + HttpEntity entity = response.getEntity(); + String result = null; + if (entity != null) { + result = EntityUtils.toString(entity, charset); + } + EntityUtils.consume(entity); + response.close(); + if(!"UTF-8".equals(getEncoding(result))) result=GBKtoUTF8(result); + return result; + }catch (Exception e) { + System.out.println("url错误:::"+e.toString()); + e.printStackTrace(); + }finally{ + try { + response.close(); + httpsClient.close(); + httpGet.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * 这里创建了忽略整数验证的CloseableHttpClient对象 + * @return + */ + public static CloseableHttpClient createSSLClientDefault() { + try { + SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { + // 信任所有 + public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return true; + } + }).build(); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); + return HttpClients.custom().setSSLSocketFactory(sslsf).build(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (KeyStoreException e) { + e.printStackTrace(); + } + return HttpClients.createDefault(); + } + + /** + * 这里创建了忽略整数验证的CloseableHttpClient对象 + * @return + */ + public static CloseableHttpClient createSSLClientCookie(CookieStore cookie) { + try { + SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { + // 信任所有 + public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return true; + } + }).build(); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); + return HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultCookieStore(cookie).build(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (KeyStoreException e) { + e.printStackTrace(); + } + return HttpClients.createDefault(); + } + + /** + * 发送post请求 + * @param url 请求地址 + * @param json json格式字符串 + * @param contentType 这里用 "application/json" + * @return + */ + public static String post(String url, String json, String contentType,String charset) { + if(charset==null||charset.trim().length()<1) charset="UTF-8"; + if("json".equals(contentType)) contentType="application/json"; + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + //HttpClient + CloseableHttpClient client = httpClientBuilder.build(); + client = (CloseableHttpClient) wrapClient(client); + HttpPost post = new HttpPost(url); + CloseableHttpResponse res = null; + try { + StringEntity s = new StringEntity(json, "utf-8"); + if (StringUtils.isBlank(contentType)) { + s.setContentType("application/json"); + } + s.setContentType(contentType); + post.setEntity(s); + res = client.execute(post); + HttpEntity entity = res.getEntity(); + String str = EntityUtils.toString(entity, charset); + if(!"UTF-8".equals(getEncoding(str))) str=GBKtoUTF8(str); + return str; + }catch (Exception e) { + System.out.println("url错误:::"+e.toString()); + e.printStackTrace(); + }finally{ + try { + res.close(); + client.close(); + post.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + @SuppressWarnings("deprecation") + private static org.apache.http.client.HttpClient wrapClient(HttpClient base) { + try { + SSLContext ctx = SSLContext.getInstance("TLSv1"); + X509TrustManager tm = new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] xcs, + String string) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] xcs, + String string) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + ctx.init(null, new TrustManager[]{tm}, null); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(ctx, new String[]{"TLSv1"}, null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + return httpclient; + + } catch (Exception ex) { + return null; + } + } + + + //正则找出所有 + public static String getUrl(String s){ + String regex = "http[s]?:\\/\\/([\\w]+\\.)+[\\w]+([\\w./?%&=]*)?"; + Pattern pattern = Pattern.compile(regex); + Matcher m = pattern.matcher(s); + String r=""; + while(m.find()){ + r+=m.group()+","; + } + return r; + } + + /** + * 检查url是否可访问 + * @param url + * @return + */ + public static boolean ckUrl(String url) { + + if (StringUtils.isBlank(url)) { + return false; + } + HttpGet httpGet = new HttpGet(url); + try { + CloseableHttpResponse response = httpClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) return false; + } catch (Exception e) { + String s = e.getMessage(); + if("Timeout waiting for connection from pool".equals(s)) return true; + return false; + } + + return true; + } + + /**检查字符串编码格式*/ + public static String getEncoding(String str) + { + String encode; + + encode = "UTF-16"; + try + { + if(str.equals(new String(str.getBytes(), encode))) + { + return encode; + } + } + catch(Exception ex) {} + + encode = "ASCII"; + try + { + if(str.equals(new String(str.getBytes(), encode))) + { + //字符串 str 中仅由数字和英文字母组成,无法识别其编码格式 + return "UTF-8"; + } + } + catch(Exception ex) {} + + encode = "ISO-8859-1"; + try + { + if(str.equals(new String(str.getBytes(), encode))) + { + return encode; + } + } + catch(Exception ex) {} + + encode = "GB2312"; + try + { + if(str.equals(new String(str.getBytes(), encode))) + { + return encode; + } + } + catch(Exception ex) {} + + encode = "UTF-8"; + try + { + if(str.equals(new String(str.getBytes(), encode))) + { + return encode; + } + } + catch(Exception ex) {} + + /* + *......待完善 + */ + + return "UTF-8"; + } + + /**将字符串转换字符编码*/ + public static String GBKtoUTF8(String str) { + if("UTF-8".equals(getEncoding(str))) return str; + + return getUTF8StringFromGBKString(str); + + } + + public static String getUTF8StringFromGBKString(String gbkStr) { + try { + return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new InternalError(); + } + } + + public static byte[] getUTF8BytesFromGBKString(String gbkStr) { + int n = gbkStr.length(); + byte[] utfBytes = new byte[3 * n]; + int k = 0; + for (int i = 0; i < n; i++) { + int m = gbkStr.charAt(i); + if (m < 128 && m >= 0) { + utfBytes[k++] = (byte) m; + continue; + } + utfBytes[k++] = (byte) (0xe0 | (m >> 12)); + utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f)); + utfBytes[k++] = (byte) (0x80 | (m & 0x3f)); + } + if (k < utfBytes.length) { + byte[] tmp = new byte[k]; + System.arraycopy(utfBytes, 0, tmp, 0, k); + return tmp; + } + return utfBytes; + } + + + /** + * 带有cookie和header 的post请求 + * @param url + * @param params + * @param cookie + * @param header + * @return + */ + @SuppressWarnings("rawtypes") + public static String doPost2(String url, Map params, CookieStore cookie,Map header,String charset) { + if(charset==null||charset.trim().length()<1) charset="UTF-8"; + if (StringUtils.isBlank(url)) { + return null; + } + + List pairs = null; + if (params != null && !params.isEmpty()) { + pairs = new ArrayList(params.size()); + for (Map.Entry entry : params.entrySet()) { + String value = entry.getValue(); + if (value != null) { + pairs.add(new BasicNameValuePair(entry.getKey(), value)); + } + } + } + HttpPost httpPost = new HttpPost(url); + + Set> set = header.entrySet(); + Iterator> s = set.iterator(); + while (s.hasNext()) { + Map.Entry m = (Map.Entry) s.next(); + httpPost.addHeader(m.getKey().toString(),m.getValue().toString()); + } + + CloseableHttpResponse response = null; + CloseableHttpClient httpClientc = null; + try { + if (pairs != null && pairs.size() > 0) { + httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET)); + } + + httpClientc = HttpUtils.createSSLClientCookie(cookie); + response = httpClientc.execute(httpPost); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + httpPost.abort(); + throw new RuntimeException("HttpClient,error status code :" + statusCode); + } + HttpEntity entity = response.getEntity(); + String result = null; + if (entity != null) { + result = EntityUtils.toString(entity, charset); + } + EntityUtils.consume(entity); + if(!"UTF-8".equals(getEncoding(result))) result=GBKtoUTF8(result); + return result; + } catch (Exception e) { + System.out.println("url错误:::"+e.toString()); + e.printStackTrace(); + }finally{ + try { + response.close(); + httpClientc.close(); + httpPost.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * 带有cookie和header 的get请求 + * @param url + * @param params + * @param cookie + * @param header + * @return + */ + @SuppressWarnings("rawtypes") + public static String doGet2(String url, Map params, CookieStore cookie,Map header,String charset) { + if(charset==null||charset.trim().length()<1) charset="UTF-8"; + if (StringUtils.isBlank(url)) { + return null; + } + + HttpGet httpGet = null; + CloseableHttpClient httpsClient = null; + CloseableHttpResponse response = null; + try { + if (params != null && !params.isEmpty()) { + List pairs = new ArrayList(params.size()); + for (Map.Entry entry : params.entrySet()) { + String value = entry.getValue(); + if (value != null) { + pairs.add(new BasicNameValuePair(entry.getKey(), value)); + } + } + url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset)); + } + httpGet = new HttpGet(url); + + Set> set = header.entrySet(); + Iterator> s = set.iterator(); + while (s.hasNext()) { + Map.Entry m = (Map.Entry) s.next(); + httpGet.addHeader(m.getKey().toString(),m.getValue().toString()); + } + + // https 注意这里获取https内容,使用了忽略证书的方式,当然还有其他的方式来获取https内容 + httpsClient = HttpUtils.createSSLClientCookie(cookie); + response = httpsClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + httpGet.abort(); + throw new RuntimeException("HttpClient,error status code :" + statusCode); + } + HttpEntity entity = response.getEntity(); + String result = null; + if (entity != null) { + result = EntityUtils.toString(entity, charset); + } + EntityUtils.consume(entity); + response.close(); + if(!"UTF-8".equals(getEncoding(result))) result=GBKtoUTF8(result); + return result; + }catch (Exception e) { + System.out.println("url错误:::"+e.toString()); + e.printStackTrace(); + }finally{ + try { + response.close(); + httpsClient.close(); + httpGet.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + + +}