jdk1.5不支持http協議,jdk1.8默認支持,比較好的解決方案是升級jdk,但是升級jdk風險極大。不能升級jdk的情況下,可以使用如下方式。
利用httpclient,進行封裝,從而實現對https的get和post請求
import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * jdk1.5中沒有封裝好的包來請求https,所以這里做了一層封裝,可以實現以下類型的請求 * http post * http get * https post * https get * * @author qianhongwei */ public class HttpUtils { private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); /** * 定義類型,用於獲取不同類型的httpclient */ enum CLIENT_TYPE { HTTP, HTTPS } /** * https post請求 * * @param url 請求地址 * @param headerMap 請求頭信息 * @param contentMap 請求體信息 * @return 結果返回 */ public static String httpsPost(String url, Map<String, String> headerMap, Map<String, String> contentMap) { return httpsPost(url, headerMap, contentMap, "UTF-8"); } /** * http post請求 * * @param url 請求地址 * @param headerMap 請求頭信息 * @param contentMap 請求體信息 * @return 結果返回 */ public static String httpPost(String url, Map<String, String> headerMap, Map<String, String> contentMap) { return httpPost(url, headerMap, contentMap, "UTF-8"); } /** * https get請求 * * @param url 請求地址 * @param paramMap 請求參數 * @return 結果返回 */ public static String httpsGet(String url, Map<String, String> paramMap) { return httpsGet(url, paramMap, "UTF-8"); } /** * http get請求 * * @param url 請求地址 * @param paramMap 請求參數 * @return 結果返回 */ public static String httpGet(String url, Map<String, String> paramMap) { return httpGet(url, paramMap, "UTF-8"); } /** * @param url 請求地址 * @param headerMap 請求頭信息 * @param contentMap 請求體信息 * @param charset 編碼類型 * @return 結果返回 */ public static String httpsPost(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset) { return post(url, headerMap, contentMap, charset, CLIENT_TYPE.HTTPS); } /** * @param url 請求地址 * @param headerMap 請求頭信息 * @param contentMap 請求體信息 * @param charset 編碼類型 * @return 結果返回 */ public static String httpPost(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset) { return post(url, headerMap, contentMap, charset, CLIENT_TYPE.HTTP); } /** * @param url 請求地址 * @param paramMap 請求參數 * @param charset 編碼類型 * @return 結果返回 */ public static String httpsGet(String url, Map<String, String> paramMap, String charset) { return get(url, paramMap, charset, CLIENT_TYPE.HTTPS); } /** * @param url 請求地址 * @param paramMap 請求參數 * @param charset 編碼類型 * @return 結果返回 */ public static String httpGet(String url, Map<String, String> paramMap, String charset) { return get(url, paramMap, charset, CLIENT_TYPE.HTTP); } /** * post 請求的實際方法 * * @param url 請求地址 * @param headerMap 請求頭信息 * @param contentMap 請求體信息 * @param charset 編碼類型 * @param type 協議類型 * @return 結果返回 */ private static String post(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset, CLIENT_TYPE type) { if (StringUtils.isBlank(url)) { throw new RuntimeException("請求url為空"); } String result = null; HttpClient httpClient = null; try { HttpPost post = new HttpPost(url); if (MapUtils.isNotEmpty(headerMap)) {// 設置請求頭 for (Map.Entry<String, String> entry : headerMap.entrySet()) { post.addHeader(entry.getKey(), entry.getValue()); } } if (MapUtils.isNotEmpty(contentMap)) {// 設置請求體 List<NameValuePair> content = getNameValuePairList(contentMap); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, charset); post.setEntity(entity); } httpClient = getClient(type);//這里是重點,根據不同協議獲取不同類型的client端 HttpResponse response = httpClient.execute(post);//發送請求並接收返回數據 if (response != null) { HttpEntity resEntity = response.getEntity(); if (resEntity != null) { result = EntityUtils.toString(resEntity, charset); } } return result; } catch (Exception ex) { throw new RuntimeException("請求:" + url + " 異常:" + ex.getMessage()); } finally { try { if (null != httpClient && null != httpClient.getConnectionManager()) { httpClient.getConnectionManager().shutdown(); } } catch (Exception e) { logger.error("請求:" + url + " 流關閉異常或者httpclient關閉異常"); } } } /** * get 請求的實際方法 * * @param url 請求地址 * @param paramMap 請求參數 * @param charset 編碼類型 * @param type 協議類型 * @return 結果返回 */ private static String get(String url, Map<String, String> paramMap, String charset, CLIENT_TYPE type) { if (StringUtils.isBlank(url)) { throw new RuntimeException("請求url為空"); } String result = null; HttpClient httpClient = null; try { if (MapUtils.isNotEmpty(paramMap)) {// 拼接參數 // 設置請求體 List<NameValuePair> content = getNameValuePairList(paramMap); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, charset); String params = EntityUtils.toString(entity); url = url + "?" + params; } HttpGet get = new HttpGet(url); httpClient = getClient(type); HttpResponse response = httpClient.execute(get); //發送請求並接收返回數據 if (response != null) { HttpEntity resEntity = response.getEntity(); if (resEntity != null) { result = EntityUtils.toString(resEntity, charset); } } return result; } catch (Exception ex) { throw new RuntimeException("請求:" + url + " 異常:" + ex.getMessage()); } finally { try { if (null != httpClient && null != httpClient.getConnectionManager()) { httpClient.getConnectionManager().shutdown(); } } catch (Exception e) { logger.error("請求:" + url + " 流關閉異常或者httpclient關閉異常"); } } } private static List<NameValuePair> getNameValuePairList(Map<String, String> paramMap) { List<NameValuePair> content = null; if (MapUtils.isNotEmpty(paramMap)) { // 設置請求體 content = new ArrayList<NameValuePair>(); for (Map.Entry<String, String> entry : paramMap.entrySet()) { content.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } } return content; } /** * 根據指定類型返回http、https類型的客戶端 * * @param type 類型 * @return 客戶端 * @throws Exception 異常信息 */ private static DefaultHttpClient getClient(CLIENT_TYPE type) throws Exception { if (type == CLIENT_TYPE.HTTP) {//http類型 return new DefaultHttpClient(); } else if (type == CLIENT_TYPE.HTTPS) {//https類型 return new SSLClient(); } else { throw new RuntimeException("未知協議類型,請重新指定"); } } /** * 自定義SSL client */ static class SSLClient extends DefaultHttpClient { public SSLClient() throws Exception { super(); X509TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; //傳輸協議需要根據自己的判斷 //SSLContext ctx = SSLContext.getInstance("TLSv1.2"); SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(null, new TrustManager[]{tm}, null); SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ClientConnectionManager ccm = this.getConnectionManager(); SchemeRegistry sr = ccm.getSchemeRegistry(); sr.register(new Scheme("https", 443, ssf)); } } public static void main(String[] args) { //Map<String, String> param = new HashMap<String, String>(); //param.put("fr", "aladdin"); //String result = httpsGet("https://baike.baidu.com/item/%E5%89%81%E6%A4%92%E9%B1%BC%E5%A4%B4/1171373", param); //String result = httpsGet("https://baike.baidu.com/item/%E5%89%81%E6%A4%92%E9%B1%BC%E5%A4%B4/1171373?fr=aladdin", null); //String result = httpGet("http://www.baidu.com",null); //System.out.println(result); } }