最近在對接某平臺的接口蟹略,需要后臺訪轉(zhuǎn)發(fā)至他們的平臺地址嘿般,原來用的HttpURLConnection后臺轉(zhuǎn)發(fā)get和post請求,但是這個接口是https請求翔脱,會報
URL401錯誤,即授權(quán)錯誤谆甜,即使在請求頭上加上用戶名和密碼之后問題依然沒有解決垃僚,
在網(wǎng)上找了好久才又找到了另一種方法,使用HttpPost請求规辱。
package com.epsoft.zsb.util;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
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.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
名稱:用于進(jìn)行post請求的HttpClient
<p>
-
修改記錄:10:11 新建 A
*/
public class SSLClient {//請求配置冈在,設(shè)置鏈接超時和讀取超時
private static final RequestConfig config = RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build();//https策略,繞過安全檢查
private static CloseableHttpClient getSingleSSLConnection()
throws Exception {
//CloseableHttpClient httpClient = null;
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException {
return true;
}
}).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
//return HttpClients.custom().setDefaultRequestConfig(config).build();
return HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(config).build();
} catch (Exception e) {
throw e;
}}
/**
HTTP Post 獲取內(nèi)容
@param params 請求的參數(shù)按摘,key-value形式
@param reqMsg 請求的參數(shù)包券,字符串
@param url 請求的url地址 ?之前的地址
@param reqCharset 編碼格式
@param resCharset 編碼格式
-
@return 頁面內(nèi)容
*/
public static String doPost(Map<String, String> params, String url, String Authorization) throws Exception {
//獲取繞過安全檢查的httpClient,以便發(fā)送https請求
CloseableHttpClient httpClient = getSingleSSLConnection();
CloseableHttpResponse response = null;
try {
//創(chuàng)建httppost方法
HttpPost httpPost = new HttpPost(url);
//添加head炫贤,需要什么填什么
httpPost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
httpPost.addHeader("Content-type", "application/x-www-form-urlencoded");
httpPost.addHeader("Charset", "UTF-8");
if (!StringUtils.isEmpty(Authorization)) {
httpPost.addHeader("Authorization","Bearer " + Authorization);
}//組裝請求參數(shù)溅固,key-value形式的 List<NameValuePair> pairs = null; if (params != null && !params.isEmpty()) { pairs = new ArrayList<NameValuePair>(params.size()); for (Map.Entry<String, String> entry : params.entrySet()) { String value = entry.getValue(); if (value != null) { pairs.add(new BasicNameValuePair(entry.getKey(), value)); } } } if (pairs != null && pairs.size() > 0) { httpPost.setEntity(new UrlEncodedFormEntity(pairs, "UTF-8")); } HttpEntity entity = null; String result = null; //執(zhí)行post方法 response = httpClient.execute(httpPost); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != 200) {//出現(xiàn)鏈接異常,拋出 httpPost.abort(); throw new Exception("HttpClient,error status code :" + statusCode); } //獲得返回結(jié)果 entity = response.getEntity(); if (entity != null) { //返回結(jié)果轉(zhuǎn)為字符串 result = EntityUtils.toString(entity, "UTF-8"); } EntityUtils.consume(entity); response.close(); return result;
} catch (Exception e) {
throw e;
} finally {
if (response != null)
try {
response.close();
} catch (IOException e) {
}
}
}
/**
* HTTP Get 獲取內(nèi)容
* @param url請求的url地址 ?之前的地址
* @param params請求的參數(shù)
* @param charset編碼格式
* @return 頁面內(nèi)容
*/
public static void sendGet(String url, Map<String, String> params) throws Exception{
//獲取繞過安全檢查的httpClient兰珍,以便發(fā)送https請求
CloseableHttpClient httpClient = getSingleSSLConnection();
CloseableHttpResponse response = null;
if(params !=null && !params.isEmpty()){
List<NameValuePair> pairs = new ArrayList<NameValuePair>(params.size());
for (String key :params.keySet()){
pairs.add(new BasicNameValuePair(key, params.get(key).toString()));
}
url +="?"+EntityUtils.toString(new UrlEncodedFormEntity(pairs), "UTF-8");
}
HttpGet 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);
}
}
}