當(dāng)前位置:
首頁(yè) >
HttpClient 发送 HTTP、HTTPS 请求的简单封装
發(fā)布時(shí)間:2025/3/15
29
豆豆
生活随笔
收集整理的這篇文章主要介紹了
HttpClient 发送 HTTP、HTTPS 请求的简单封装
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
序
近期這幾周。一直在忙同一個(gè)項(xiàng)目。剛開(kāi)始是了解需求。需求有一定了解之后,就開(kāi)始調(diào)第三方的接口。因?yàn)榈谌浇o提供的文檔非常模糊,在調(diào)接口的時(shí)候,出了非常多問(wèn)題,一直在溝通協(xié)調(diào),詳細(xì)的無(wú)奈就不說(shuō)了,因?yàn)榻涌诘脑L問(wèn)協(xié)議是通過(guò) HTTP 和 HTTPS 通訊的,因此封裝了一個(gè)簡(jiǎn)單的請(qǐng)求工具類(lèi)。因?yàn)闀r(shí)間緊迫。并沒(méi)有額外的時(shí)間對(duì)工具類(lèi)進(jìn)行優(yōu)化和擴(kuò)展。假設(shè)興許空出時(shí)間的話(huà),我會(huì)對(duì)該工具類(lèi)繼續(xù)進(jìn)行優(yōu)化和擴(kuò)展的。
引用
首先說(shuō)一下該類(lèi)中須要引入的 jar 包,apache 的 httpclient 包,版本為 4.5,如有須要的話(huà)。可以引一下。
代碼
<span style="font-family:Comic Sans MS;">import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; 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.conn.ssl.SSLContextBuilder; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*** HTTP 請(qǐng)求工具類(lèi)** @author : liii* @version : 1.0.0* @date : 2015/7/21* @see : TODO*/ public class HttpUtil {private static PoolingHttpClientConnectionManager connMgr;private static RequestConfig requestConfig;private static final int MAX_TIMEOUT = 7000;static {// 設(shè)置連接池connMgr = new PoolingHttpClientConnectionManager();// 設(shè)置連接池大小connMgr.setMaxTotal(100);connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());RequestConfig.Builder configBuilder = RequestConfig.custom();// 設(shè)置連接超時(shí)configBuilder.setConnectTimeout(MAX_TIMEOUT);// 設(shè)置讀取超時(shí)configBuilder.setSocketTimeout(MAX_TIMEOUT);// 設(shè)置從連接池獲取連接實(shí)例的超時(shí)configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);// 在提交請(qǐng)求之前 測(cè)試連接是否可用configBuilder.setStaleConnectionCheckEnabled(true);requestConfig = configBuilder.build();}/*** 發(fā)送 GET 請(qǐng)求(HTTP)。不帶輸入數(shù)據(jù)* @param url* @return*/public static String doGet(String url) {return doGet(url, new HashMap<String, Object>());}/*** 發(fā)送 GET 請(qǐng)求(HTTP)。K-V形式* @param url* @param params* @return*/public static String doGet(String url, Map<String, Object> params) {String apiUrl = url;StringBuffer param = new StringBuffer();int i = 0;for (String key : params.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(params.get(key));i++;}apiUrl += param;String result = null;HttpClient httpclient = new DefaultHttpClient();try {HttpGet httpPost = new HttpGet(apiUrl);HttpResponse response = httpclient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();System.out.println("運(yùn)行狀態(tài)碼 : " + statusCode);HttpEntity entity = response.getEntity();if (entity != null) {InputStream instream = entity.getContent();result = IOUtils.toString(instream, "UTF-8");}} catch (IOException e) {e.printStackTrace();}return result;}/*** 發(fā)送 POST 請(qǐng)求(HTTP),不帶輸入數(shù)據(jù)* @param apiUrl* @return*/public static String doPost(String apiUrl) {return doPost(apiUrl, new HashMap<String, Object>());}/*** 發(fā)送 POST 請(qǐng)求(HTTP),K-V形式* @param apiUrl API接口URL* @param params 參數(shù)map* @return*/public static String doPost(String apiUrl, Map<String, Object> params) {CloseableHttpClient httpClient = HttpClients.createDefault();String httpStr = null;HttpPost httpPost = new HttpPost(apiUrl);CloseableHttpResponse response = null;try {httpPost.setConfig(requestConfig);List<NameValuePair> pairList = new ArrayList<>(params.size());for (Map.Entry<String, Object> entry : params.entrySet()) {NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());pairList.add(pair);}httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));response = httpClient.execute(httpPost);System.out.println(response.toString());HttpEntity entity = response.getEntity();httpStr = EntityUtils.toString(entity, "UTF-8");} catch (IOException e) {e.printStackTrace();} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {e.printStackTrace();}}}return httpStr;}/*** 發(fā)送 POST 請(qǐng)求(HTTP),JSON形式* @param apiUrl* @param json json對(duì)象* @return*/public static String doPost(String apiUrl, Object json) {CloseableHttpClient httpClient = HttpClients.createDefault();String httpStr = null;HttpPost httpPost = new HttpPost(apiUrl);CloseableHttpResponse response = null;try {httpPost.setConfig(requestConfig);StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解決中文亂碼問(wèn)題stringEntity.setContentEncoding("UTF-8");stringEntity.setContentType("application/json");httpPost.setEntity(stringEntity);response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();System.out.println(response.getStatusLine().getStatusCode());httpStr = EntityUtils.toString(entity, "UTF-8");} catch (IOException e) {e.printStackTrace();} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {e.printStackTrace();}}}return httpStr;}/*** 發(fā)送 SSL POST 請(qǐng)求(HTTPS),K-V形式* @param apiUrl API接口URL* @param params 參數(shù)map* @return*/public static String doPostSSL(String apiUrl, Map<String, Object> params) {CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();HttpPost httpPost = new HttpPost(apiUrl);CloseableHttpResponse response = null;String httpStr = null;try {httpPost.setConfig(requestConfig);List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());for (Map.Entry<String, Object> entry : params.entrySet()) {NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());pairList.add(pair);}httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));response = httpClient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != HttpStatus.SC_OK) {return null;}HttpEntity entity = response.getEntity();if (entity == null) {return null;}httpStr = EntityUtils.toString(entity, "utf-8");} catch (Exception e) {e.printStackTrace();} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {e.printStackTrace();}}}return httpStr;}/*** 發(fā)送 SSL POST 請(qǐng)求(HTTPS),JSON形式* @param apiUrl API接口URL* @param json JSON對(duì)象* @return*/public static String doPostSSL(String apiUrl, Object json) {CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();HttpPost httpPost = new HttpPost(apiUrl);CloseableHttpResponse response = null;String httpStr = null;try {httpPost.setConfig(requestConfig);StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解決中文亂碼問(wèn)題stringEntity.setContentEncoding("UTF-8");stringEntity.setContentType("application/json");httpPost.setEntity(stringEntity);response = httpClient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != HttpStatus.SC_OK) {return null;}HttpEntity entity = response.getEntity();if (entity == null) {return null;}httpStr = EntityUtils.toString(entity, "utf-8");} catch (Exception e) {e.printStackTrace();} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {e.printStackTrace();}}}return httpStr;}/*** 創(chuàng)建SSL安全連接** @return*/private static SSLConnectionSocketFactory createSSLConnSocketFactory() {SSLConnectionSocketFactory sslsf = null;try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {return true;}}).build();sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}@Overridepublic void verify(String host, SSLSocket ssl) throws IOException {}@Overridepublic void verify(String host, X509Certificate cert) throws SSLException {}@Overridepublic void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {}});} catch (GeneralSecurityException e) {e.printStackTrace();}return sslsf;}/*** 測(cè)試方法* @param args*/public static void main(String[] args) throws Exception {} }</span>
結(jié)束語(yǔ)
工具類(lèi)封裝的比較粗糙。興許還會(huì)繼續(xù)優(yōu)化的,假設(shè)小伙伴們有更好的選擇的話(huà),希望也可以分享出來(lái),大家一起學(xué)習(xí)。
轉(zhuǎn)載于:https://www.cnblogs.com/llguanli/p/8398448.html
總結(jié)
以上是生活随笔為你收集整理的HttpClient 发送 HTTP、HTTPS 请求的简单封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 这么大一座Azure“图书馆”,你竟没有
- 下一篇: jvm相关參数,调优