JAVA——HttpClient封装工具类
生活随笔
收集整理的這篇文章主要介紹了
JAVA——HttpClient封装工具类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在日常開發中,我們經常需要通過http協議去調用網絡內容,雖然java自身提供了net相關工具包,但是其靈活性和功能總是不如人意,于是有人專門搞出一個httpclient類庫,來方便進行Http操作。簡單的對httpcient的簡單操作封裝成一個工具類,統一放在項目的工具包中,在使用的時候直接從工具包中調用,不需要寫冗余代碼。
DEMO 1?
package club.zstuca.myzstu.httpclient;import club.zstuca.myzstu.consts.Consts; import org.apache.commons.collections4.MapUtils; import org.apache.http.*; 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.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils;import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map;/*** Http/Https請求的工具類*/ public class HttpClientUtils {private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class);private static RequestConfig requestConfig=null;static{requestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(5000).setRedirectsEnabled(false).build();}/*** 發送post請求** @param url 請求地址* @param header 請求頭參數* @param params json/xml參數* @return*/public static String doPostRequest(String url, Map<String, String> header, Map<String, String> params) {String resultStr = "";if (StringUtils.isEmpty(url)) {return resultStr;}logger.info(url);CloseableHttpClient httpClient = null;CloseableHttpResponse httpResponse = null;try {httpClient = HTTPClientPool.getHttpClient();HttpPost httpPost = new HttpPost(url);httpPost.setConfig(requestConfig);if (MapUtils.isEmpty(header)) {for (Map.Entry<String, String> headerEntry : header.entrySet()) {httpPost.setHeader(headerEntry.getKey(), headerEntry.getValue());}}if (MapUtils.isEmpty(params)) {List<NameValuePair> paramspair=new ArrayList<>();for (Map.Entry<String, String> paramEntry:header.entrySet()) {paramspair.add(new BasicNameValuePair(paramEntry.getKey(),paramEntry.getValue()));}httpPost.setEntity(new UrlEncodedFormEntity(paramspair, Consts.ENCODING));}httpResponse = httpClient.execute(httpPost);int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity httpResponseEntity = httpResponse.getEntity();resultStr = EntityUtils.toString(httpResponseEntity, Consts.ENCODING);//logger.info("POST請求正常,請求地址:{},響應結果:{}", url, resultStr);} else {StringBuffer stringBuffer = new StringBuffer();HeaderIterator headerIterator = httpResponse.headerIterator();while (headerIterator.hasNext()) {stringBuffer.append("\t" + headerIterator.next());}httpPost.abort();//logger.info("POST請求異常信息:請求地址:{},響應狀態:{},請求返回結果:{}", url, httpResponse.getStatusLine().getStatusCode(),stringBuffer);throw new RuntimeException("HttpClient,error status code :" + statusCode);}} catch (Exception e) {e.printStackTrace();} finally {HttpClientUtils.closeConnection(httpClient, httpResponse);}return resultStr;}public static String doGetRequest(String url, Map<String, String> header, Map<String, String> params) {String resultStr = "";if (StringUtils.isEmpty(url)) {return resultStr;}logger.info(url);CloseableHttpClient httpClient = null;CloseableHttpResponse httpResponse = null;try {httpClient = HTTPClientPool.getHttpClient();URIBuilder urlbuilder = new URIBuilder(url);if (MapUtils.isNotEmpty(params)) {// Set GET paramsfor (Map.Entry<String, String> stringStringEntry : params.entrySet()) {urlbuilder.setParameter(stringStringEntry.getKey(), stringStringEntry.getValue());}}HttpGet httpGet = new HttpGet(urlbuilder.build());logger.info(urlbuilder.build().toURL().toString());httpGet.setConfig(requestConfig);if (MapUtils.isNotEmpty(header)) {for (Map.Entry<String, String> stringStringEntry : header.entrySet()) {httpGet.setHeader(stringStringEntry.getKey(), stringStringEntry.getValue());}}//發起請求httpResponse = httpClient.execute(httpGet);int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {resultStr = EntityUtils.toString(httpResponse.getEntity(), Consts.ENCODING);//logger.info("GET請求正常,請求地址:{},響應結果:{}", url,resultStr);} else {StringBuffer stringBuffer = new StringBuffer();HeaderIterator headerIterator = httpResponse.headerIterator();while (headerIterator.hasNext()) {stringBuffer.append("\t" + headerIterator.next());}httpGet.abort();//logger.info("GET請求異常信息:請求響應狀態:{},請求返回結果:{}", httpResponse.getStatusLine().getStatusCode(), stringBuffer);throw new RuntimeException("HttpClient,error status code :" + statusCode);}} catch (Exception e) {e.printStackTrace();} finally {HttpClientUtils.closeConnection(httpClient, httpResponse);}return resultStr;}/*** 關掉連接釋放資源*/private static void closeConnection(CloseableHttpClient httpClient, CloseableHttpResponse httpResponse) {if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}if (httpResponse != null) {try {httpResponse.close();} catch (IOException e) {e.printStackTrace();}}} }DEMO 2
import java.io.IOException; 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.List; import java.util.Map;import javax.net.ssl.SSLContext;import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.ParseException; 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.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工具類* * @author 愛琴孩* */ public class HttpClientTool {private static final CloseableHttpClient httpClient;public static final String CHARSET = "UTF-8";// 采用靜態代碼塊,初始化超時時間配置,再根據配置生成默認httpClient對象static {RequestConfig config = RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(15000).build();httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();}public static String doGet(String url, Map<String, String> params) {return doGet(url, params, CHARSET);}public static String doGetSSL(String url, Map<String, String> params) {return doGetSSL(url, params, CHARSET);}public static String doPost(String url, Map<String, String> params) throws IOException {return doPost(url, params, CHARSET);}/*** HTTP Get 獲取內容* @param url 請求的url地址 ?之前的地址* @param params 請求的參數* @param charset 編碼格式* @return 頁面內容*/public static String doGet(String url, Map<String, String> params, String charset) {if (StringUtils.isBlank(url)) {return null;}try {if (params != null && !params.isEmpty()) {List<NameValuePair> 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));}}// 將請求參數和url進行拼接url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));}HttpGet httpGet = new HttpGet(url);CloseableHttpResponse 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, "utf-8");}EntityUtils.consume(entity);response.close();return result;} catch (Exception e) {e.printStackTrace();}return null;}/*** HTTP Post 獲取內容* @param url 請求的url地址 ?之前的地址* @param params 請求的參數* @param charset 編碼格式* @return 頁面內容* @throws IOException*/public static String doPost(String url, Map<String, String> params, String charset) throws IOException {if (StringUtils.isBlank(url)) {return null;}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));}}}HttpPost httpPost = new HttpPost(url);if (pairs != null && pairs.size() > 0) {httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET));}CloseableHttpResponse response = null;try {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, "utf-8");}EntityUtils.consume(entity);return result;} catch (ParseException e) {e.printStackTrace();} finally {if (response != null)response.close();}return null;}/*** HTTPS Get 獲取內容* @param url 請求的url地址 ?之前的地址* @param params 請求的參數* @param charset 編碼格式* @return 頁面內容*/public static String doGetSSL(String url, Map<String, String> params, String charset) {if (StringUtils.isBlank(url)) {return null;}try {if (params != null && !params.isEmpty()) {List<NameValuePair> 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));}}url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));}HttpGet httpGet = new HttpGet(url);// https 注意這里獲取https內容,使用了忽略證書的方式,當然還有其他的方式來獲取https內容CloseableHttpClient httpsClient = HttpClientTool.createSSLClientDefault();CloseableHttpResponse 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, "utf-8");}EntityUtils.consume(entity);response.close();return result;} catch (Exception 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();} }DEMO 3
package zhihuisystem.HttpClient_Test;import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; 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.scheme.Scheme; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils;public class HttpClient_Utils {// 常規get請求public static String Getmethod(String url) {CloseableHttpClient client = HttpClientBuilder.create().build();HttpGet get = new HttpGet(url);CloseableHttpResponse respons1 = null;try {respons1 = client.execute(get);} catch (ClientProtocolException e1) {System.out.println("客戶端get請求異常");e1.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}// 切割字符串String result = respons1.getStatusLine().toString().split(" ")[1];try {client.close();// 釋放資源} catch (IOException e) {System.out.println("請求連接無法關閉,關注get方法!");e.printStackTrace();}return result;}// 常規P0ST請求public static String HttpPostWithJson(String url, String json) {String returnValue = "這是默認返回值,接口調用失敗";CloseableHttpClient httpClient = HttpClients.createDefault();ResponseHandler<String> responseHandler = new BasicResponseHandler();try {// 創建HttpClient對象httpClient = HttpClients.createDefault();// 創建httpPost對象HttpPost httpPost = new HttpPost(url);// 給httpPost設置JSON格式的參數StringEntity requestEntity = new StringEntity(json, "utf-8");requestEntity.setContentEncoding("UTF-8");httpPost.setHeader("Content-type", "application/json");httpPost.setEntity(requestEntity);// 發送HttpPost請求,獲取返回值returnValue = httpClient.execute(httpPost, responseHandler); // 調接口獲取返回值,用此方法} catch (Exception e) {System.out.println("請求返回值為空!");e.printStackTrace();}finally {try {httpClient.close();} catch (IOException e) {System.out.println("請求連接無法關閉,關注post方法!");e.printStackTrace();}}// 第五步:處理返回值return returnValue;}// 忽略證書的HTTPS請求 - getpublic static String HttpsGetIgnoreCertification(String url)throws NoSuchAlgorithmException, KeyManagementException, ClientProtocolException, IOException {// First create a trust manager that won't care.X509TrustManager trustManager = new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {// Don't do anything.}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {// Don't do anything.}public X509Certificate[] getAcceptedIssuers() {// Don't do anything.return null;}};// 現在將信任管理器放到SSLContext中。SSLContext sslcontext = SSLContext.getInstance("SSL");sslcontext.init(null, new TrustManager[] { trustManager }, null);SSLSocketFactory sf = new SSLSocketFactory(sslcontext);sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", sf, 443));HttpGet httpget = new HttpGet(url); // String result = "";httpget.setHeader("Content-type", "application/json");HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();EntityUtils.consume(entity); // String result1 = response.getStatusLine().toString(); // String result2 = response.getStatusLine().toString().split(" ")[2];String result3 = response.getStatusLine().toString().split(" ")[1];return result3;}// 忽略證書的HTTPS請求 - postpublic static String HttpsPostIgnoreCertification(String url, String requestData)throws NoSuchAlgorithmException, KeyManagementException, ClientProtocolException, IOException {// First create a trust manager that won't care.X509TrustManager trustManager = new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {// Don't do anything.}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {// Don't do anything.}public X509Certificate[] getAcceptedIssuers() {// Don't do anything.return null;}};// 現在將信任管理器放到SSLContext中。SSLContext sslcontext = SSLContext.getInstance("SSL");sslcontext.init(null, new TrustManager[] { trustManager }, null);SSLSocketFactory sf = new SSLSocketFactory(sslcontext);sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", sf, 443));HttpPost httpPost = new HttpPost(url);String result = ""; // httpPost.setHeader("Authorization", "basic " + "dGNsb3VkYWRtaW46dGNsb3VkMTIz");httpPost.setHeader("Content-type", "application/json");StringEntity reqEntity;// 將請求參數封裝成HttpEntityreqEntity = new StringEntity(requestData);BufferedHttpEntity bhe = new BufferedHttpEntity(reqEntity);httpPost.setEntity(bhe);HttpResponse response = httpclient.execute(httpPost);HttpEntity resEntity = response.getEntity();InputStreamReader reader = new InputStreamReader(resEntity.getContent());// 取內存資源char[] buff = new char[1024];int length = 0;while ((length = reader.read(buff)) != -1) {result += new String(buff, 0, length);}httpclient.close();return result;// System.out.println(result);}// 啟用HTTPS攜帶證書GET請求public static String HttpsforGet(String url, String keystore_PathFile, String keypwd) throws IOException,KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException {HttpGet httpGet = new HttpGet(url);CloseableHttpClient httpClient = null;if (url.startsWith("https")) { // "E:\\White_testNG\\mock\\mock_https\\isa\\isa.keystor"File cert = new File(keystore_PathFile);String keystore = keypwd;// Trust own CA and all self-signed certsSSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(cert, keystore.toCharArray(), new TrustSelfSignedStrategy()).build();// Allow TLSv1 protocol onlySSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" },null, NoopHostnameVerifier.INSTANCE);httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();} else {httpClient = HttpClients.createDefault();}try (CloseableHttpClient _httpClient = httpClient; CloseableHttpResponse res = _httpClient.execute(httpGet);) {StatusLine sl = res.getStatusLine(); // System.out.println(sl.toString().split(" ")[1]);String result = sl.toString().split(" ")[1];/** if (sl != null) { System.out.println(sl.getStatusCode()); StringBuilder* builder = new StringBuilder(); try (InputStream is =* res.getEntity().getContent(); InputStreamReader isr = new* InputStreamReader(is); BufferedReader br = new BufferedReader(isr);) { String* line = br.readLine(); while(line != null) { builder.append(line); line =* br.readLine(); } System.out.println("響應結果:" + builder.toString());*/return result;}}// 啟用HTTPS攜帶證書post請求public static String HttpsforPost(String url, String keystore_PathFile, String keypwd, String json)throws ClientProtocolException, IOException, KeyManagementException, NoSuchAlgorithmException,KeyStoreException, CertificateException {String returnValue = "這是默認返回值,接口調用失敗";HttpPost httppost = new HttpPost(url);CloseableHttpClient httpClient = null;if (url.startsWith("https")) {File cert = new File(keystore_PathFile);String keystore = keypwd;// Trust own CA and all self-signed certsSSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(cert, keystore.toCharArray(), new TrustSelfSignedStrategy()).build();// Allow TLSv1 protocol onlySSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" },null, NoopHostnameVerifier.INSTANCE);httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();} else {httpClient = HttpClients.createDefault();}ResponseHandler<String> responseHandler = new BasicResponseHandler();try (CloseableHttpClient _httpClient = httpClient; CloseableHttpResponse res = _httpClient.execute(httppost);) {StringEntity requestEntity = new StringEntity(json, "utf-8");requestEntity.setContentEncoding("UTF-8");httppost.setHeader("Content-type", "application/json");httppost.setEntity(requestEntity);// 發送HttpPost請求,獲取返回值returnValue = httpClient.execute(httppost, responseHandler); // 調接口獲取返回值,用此方法// System.out.println(returnValue);}return returnValue;}}參考文章
https://www.cnblogs.com/relax-zw/p/9883959.html
https://blog.csdn.net/qq_28165595/article/details/78885775
總結
以上是生活随笔為你收集整理的JAVA——HttpClient封装工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA——基于HttpClient的正
- 下一篇: Thymeleaf——访问静态资源(st