/** * Copyright (c) 2015-2016, Michael Yang 杨福海 (fuhai999@gmail.com). *

* Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.gnu.org/licenses/lgpl-3.0.txt *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.terra.proxy.util; import javax.net.ssl.*; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.cert.X509Certificate; import java.util.Map; /** * @author lanbase * @Description: TODO(http工具) * @date 2017-6-23 15:07 */ public class HttpUtils { private static final String TAG = "HttpUtils"; private static final int mReadTimeOut = 1000 * 10; // 10秒 private static final int mConnectTimeOut = 1000 * 5; // 5秒 private static final String CHAR_SET = "utf-8"; private static final int mRetry = 2; // 默认尝试访问次数 public static String get(String url) throws Exception { return get(url, null); } public static String get(String url, Map params) throws Exception { return get(url, params, null); } public static String get(String url, Map params, Map headers) throws Exception { if (url == null || url.trim().length() == 0) { throw new Exception(TAG + ": url is null or empty!"); } if (params != null && params.size() > 0) { if (!url.contains("?")) { url += "?"; } if (url.charAt(url.length() - 1) != '?') { url += "&"; } url += buildParams(params); } return tryToGet(url, headers); } public static String buildParams(Map params) throws UnsupportedEncodingException { if (params == null || params.isEmpty()) { return null; } StringBuilder builder = new StringBuilder(); for (Map.Entry entry : params.entrySet()) { if (entry.getKey() != null && entry.getValue() != null) builder.append(entry.getKey().trim()).append("=") .append(URLEncoder.encode(entry.getValue().toString(), CHAR_SET)).append("&"); } if (builder.charAt(builder.length() - 1) == '&') { builder.deleteCharAt(builder.length() - 1); } return builder.toString(); } private static String tryToGet(String url, Map headers) throws Exception { int tryTime = 0; Exception ex = null; while (tryTime < mRetry) { try { return doGet(url, headers); } catch (Exception e) { if (e != null) ex = e; tryTime++; } } if (ex != null) throw ex; else throw new Exception("未知网络错误 "); } private static String doGet(String strUrl, Map headers) throws Exception { HttpURLConnection connection = null; InputStream stream = null; try { connection = getConnection(strUrl); configConnection(connection); if (headers != null && headers.size() > 0) { for (Map.Entry entry : headers.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } } connection.setInstanceFollowRedirects(true); connection.connect(); stream = connection.getInputStream(); ByteArrayOutputStream obs = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; for (int len = 0; (len = stream.read(buffer)) > 0; ) { obs.write(buffer, 0, len); } obs.flush(); obs.close(); stream.close(); return new String(obs.toByteArray()); } finally { if (connection != null) { connection.disconnect(); } if (stream != null) { stream.close(); } } } public static String post(String url) throws Exception { return post(url, null); } public static String post(String url, Map params) throws Exception { return post(url, params, null); } public static String post(String url, Map params, Map headers) throws Exception { if (url == null || url.trim().length() == 0) { throw new Exception(TAG + ":url is null or empty!"); } if (params != null && params.size() > 0) { return tryToPost(url, buildParams(params), headers); } else { return tryToPost(url, null, headers); } } public static String post(String url, String content, Map headers) throws Exception { return tryToPost(url, content, headers); } private static String tryToPost(String url, String postContent, Map headers) throws Exception { int tryTime = 0; Exception ex = null; while (tryTime < mRetry) { try { return doPost(url, postContent, headers); } catch (Exception e) { if (e != null) ex = e; tryTime++; } } if (ex != null) throw ex; else throw new Exception("未知网络错误 "); } private static String doPost(String strUrl, String postContent, Map headers) throws Exception { HttpURLConnection connection = null; InputStream stream = null; try { connection = getConnection(strUrl); configConnection(connection); if (headers != null && headers.size() > 0) { for (Map.Entry entry : headers.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } } connection.setRequestMethod("POST"); connection.setDoOutput(true); if (null != postContent && !"".equals(postContent)) { DataOutputStream dos = new DataOutputStream(connection.getOutputStream()); dos.write(postContent.getBytes(CHAR_SET)); dos.flush(); dos.close(); } stream = connection.getInputStream(); ByteArrayOutputStream obs = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; for (int len = 0; (len = stream.read(buffer)) > 0; ) { obs.write(buffer, 0, len); } obs.flush(); obs.close(); return new String(obs.toByteArray()); } finally { if (connection != null) { connection.disconnect(); } if (stream != null) { stream.close(); } } } private static void configConnection(HttpURLConnection connection) { if (connection == null) return; connection.setReadTimeout(mReadTimeOut); connection.setConnectTimeout(mConnectTimeOut); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"); } private static HttpURLConnection getConnection(String strUrl) throws Exception { if (strUrl == null) { return null; } if (strUrl.toLowerCase().startsWith("https")) { return getHttpsConnection(strUrl); } else { return getHttpConnection(strUrl); } } private static HttpURLConnection getHttpConnection(String urlStr) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); return conn; } private static HttpsURLConnection getHttpsConnection(String urlStr) throws Exception { URL url = new URL(urlStr); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setHostnameVerifier(hnv); SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); if (sslContext != null) { TrustManager[] tm = {xtm}; sslContext.init(null, tm, null); SSLSocketFactory ssf = sslContext.getSocketFactory(); conn.setSSLSocketFactory(ssf); } return conn; } private static X509TrustManager xtm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) { } public void checkServerTrusted(X509Certificate[] chain, String authType) { } public X509Certificate[] getAcceptedIssuers() { return null; } }; private static HostnameVerifier hnv = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; }