HttpClient詳細(xì)使用示例代碼
1、導(dǎo)入依賴
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.13</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency>
2、使用工具類
該工具類將get請(qǐng)求和post請(qǐng)求當(dāng)中幾種傳參方式都寫了,其中有g(shù)et地址欄傳參、get的params傳參、post的params傳參、post的json傳參。
import com.alibaba.fastjson.JSONObject; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; 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.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; 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; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; public class HttpClientUtil { private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class); private static final int DEFULT_TIMEOUT = 30 * 1000;//默認(rèn)超時(shí)時(shí)間20秒 /** * 可以訪問 http://localhost:9005/yzhwsj/addPersonal/1/2 這樣的接口 * @param url * @param headers * @param urlParam * @param timeout * @return */ private static String doUrlGet(String url, Map<String, String> headers, List<String> urlParam, Integer timeout) { //創(chuàng)建httpClient對(duì)象 CloseableHttpClient httpClient = HttpClients.createDefault(); String resultString = null; CloseableHttpResponse response = null; try { //創(chuàng)建uri if (urlParam != null){ for (String param : urlParam) { url = url + "/" + param; } } //創(chuàng)建hTTP get請(qǐng)求 HttpGet httpGet = new HttpGet(url); //設(shè)置超時(shí)時(shí)間 int timeoutTmp = DEFULT_TIMEOUT; if (timeout != null) { timeoutTmp = timeout; } RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp) .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build(); httpGet.setConfig(requestConfig); //設(shè)置頭信息 if (null != headers) { for (String key : headers.keySet()) { httpGet.setHeader(key, headers.get(key)); } } //執(zhí)行請(qǐng)求 response = httpClient.execute(httpGet); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8); } } catch (IOException e) { logger.error("http調(diào)用異常" + e.toString(), e); } finally { try { if (null != response) { response.close(); } } catch (IOException e) { logger.error("response關(guān)閉異常" + e.toString(), e); } try { if (null != httpClient) { httpClient.close(); } } catch (IOException e) { logger.error("httpClient關(guān)閉異常" + e.toString(), e); } } return resultString; } /** * @param url * @param headers * @param params * @param timeout * @return */ private static String doGet(String url, Map<String, String> headers, Map<String, Object> params, Integer timeout) { //創(chuàng)建httpClient對(duì)象 CloseableHttpClient httpClient = HttpClients.createDefault(); String resultString = null; CloseableHttpResponse response = null; try { // 1.創(chuàng)建uri URIBuilder builder = new URIBuilder(url); if (params != null) { //uri添加參數(shù) for (String key : params.keySet()) { builder.addParameter(key, String.valueOf(params.get(key))); } } URI uri = builder.build(); // 2.創(chuàng)建hTTP get請(qǐng)求 HttpGet httpGet = new HttpGet(uri); // 3.設(shè)置超時(shí)時(shí)間 int timeoutTmp = DEFULT_TIMEOUT; if (timeout != null) { timeoutTmp = timeout; } RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp) .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build(); httpGet.setConfig(requestConfig); // 4.設(shè)置頭信息 if (null != headers) { for (String key : headers.keySet()) { httpGet.setHeader(key, headers.get(key)); } } // 5.執(zhí)行請(qǐng)求 response = httpClient.execute(httpGet); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8); } } catch (URISyntaxException e) { logger.error("http調(diào)用異常" + e.toString(), e); } catch (IOException e) { logger.error("http調(diào)用異常" + e.toString(), e); } finally { try { if (null != response) { response.close(); } } catch (IOException e) { logger.error("response關(guān)閉異常" + e.toString(), e); } try { if (null != httpClient) { httpClient.close(); } } catch (IOException e) { logger.error("httpClient關(guān)閉異常" + e.toString(), e); } } return resultString; } /** * 調(diào)用http post請(qǐng)求(json數(shù)據(jù)) * * @param url * @param headers * @param json * @return */ public static String doJsonPost(String url, Map<String, String> headers, JSONObject json, Integer timeout) { CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 1.創(chuàng)建http post請(qǐng)求 HttpPost httpPost = new HttpPost(url); // 2.設(shè)置超時(shí)時(shí)間 int timeoutTmp = DEFULT_TIMEOUT; if (timeout != null) { timeoutTmp = timeout; } RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp) .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build(); httpPost.setConfig(requestConfig); // 3.設(shè)置參數(shù)信息 StringEntity s = new StringEntity(json.toString(), Consts.UTF_8); // 發(fā)送json數(shù)據(jù)需要設(shè)置的contentType s.setContentType("application/json"); httpPost.setEntity(s); // 4.設(shè)置頭信息 if (headers != null) { for (String key : headers.keySet()) { httpPost.setHeader(key, headers.get(key)); } } // 5.執(zhí)行http請(qǐng)求 response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8); } } catch (UnsupportedEncodingException e) { logger.error("調(diào)用http異常" + e.toString(), e); } catch (ClientProtocolException e) { logger.error("調(diào)用http異常" + e.toString(), e); } catch (IOException e) { logger.error("調(diào)用http異常" + e.toString(), e); } finally { try { if (null != response) { response.close(); } } catch (IOException e) { logger.error("關(guān)閉response異常" + e.toString(), e); } try { if (null != httpClient) { httpClient.close(); } } catch (IOException e) { logger.error("關(guān)閉httpClient異常" + e.toString(), e); } } return resultString; } /** * 調(diào)用http post請(qǐng)求 基礎(chǔ)方法 * * @param url 請(qǐng)求的url * @param headers 請(qǐng)求頭 * @param params 參數(shù) * @param timeout 超時(shí)時(shí)間 * @return */ public static String doPost(String url, Map<String, String> headers, Map<String, Object> params, Integer timeout) { CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 1.創(chuàng)建http post請(qǐng)求 HttpPost httpPost = new HttpPost(url); // 2.設(shè)置超時(shí)時(shí)間 int timeoutTmp = DEFULT_TIMEOUT; if (timeout != null) { timeoutTmp = timeout; } RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp) .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build(); httpPost.setConfig(requestConfig); // 3.設(shè)置參數(shù)信息 if (params != null) { List<NameValuePair> paramList = new ArrayList<>(); for (String key : params.keySet()) { paramList.add(new BasicNameValuePair(key, String.valueOf(params.get(key)))); } // 模擬表單 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, Consts.UTF_8); httpPost.setEntity(entity); } // 4.設(shè)置頭信息 if (headers != null) { for (String key : headers.keySet()) { httpPost.setHeader(key, headers.get(key)); } } // 5.執(zhí)行http請(qǐng)求 response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8); } } catch (UnsupportedEncodingException e) { logger.error("調(diào)用http異常" + e.toString(), e); } catch (ClientProtocolException e) { logger.error("調(diào)用http異常" + e.toString(), e); } catch (IOException e) { logger.error("調(diào)用http異常" + e.toString(), e); } finally { try { if (null != response) { response.close(); } } catch (IOException e) { logger.error("關(guān)閉response異常" + e.toString(), e); } try { if (null != httpClient) { httpClient.close(); } } catch (IOException e) { logger.error("關(guān)閉httpClient異常" + e.toString(), e); } } return resultString; } /** * 通過httpClient上傳文件 * * @param url 請(qǐng)求的URL * @param headers 請(qǐng)求頭參數(shù) * @param path 文件路徑 * @param fileName 文件名稱 * @param timeout 超時(shí)時(shí)間 * @return */ public static String UploadFileByHttpClient(String url, Map<String, String> headers, String path, String fileName, Integer timeout) { String resultString = ""; CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; InputStream content = null; BufferedReader in = null; try { // 1.創(chuàng)建http post請(qǐng)求 HttpPost httpPost = new HttpPost(url); // 2.設(shè)置超時(shí)時(shí)間 int timeoutTmp = DEFULT_TIMEOUT; if (timeout != null) { timeoutTmp = timeout; } RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp) .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build(); httpPost.setConfig(requestConfig); // 3.設(shè)置參數(shù)信息 // HttpMultipartMode.RFC6532參數(shù)的設(shè)定是為避免文件名為中文時(shí)亂碼 MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532); // 上傳文件的路徑 File file = new File(path + File.separator + fileName); builder.setCharset(Charset.forName("UTF-8")); builder.addBinaryBody("file", file, ContentType.MULTIPART_FORM_DATA, fileName); HttpEntity entity = builder.build(); httpPost.setEntity(entity); // 4.設(shè)置頭信息 if (headers != null) { for (String key : headers.keySet()) { httpPost.setHeader(key, headers.get(key)); } } // 5.執(zhí)行http請(qǐng)求 response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8); } } catch (Exception e) { logger.error("上傳文件失?。?, e); } finally { try { if (null != httpClient) { httpClient.close(); } } catch (IOException e) { logger.error("關(guān)閉httpClient異常" + e.toString(), e); } try { if (null != content) { content.close(); } } catch (IOException e) { logger.error("關(guān)閉content異常" + e.toString(), e); } try { if (null != in) { in.close(); } } catch (IOException e) { logger.error("關(guān)閉in異常" + e.toString(), e); } } return resultString; } } /** * 通過httpClient批量上傳文件 * * @param url 請(qǐng)求的URL * @param headers 請(qǐng)求頭參數(shù) * @param params 參數(shù) * @param paths 文件路徑(key文件名稱,value路徑) * @param timeout 超時(shí)時(shí)間 * @return */ public static String UploadFilesByHttpClient(String url, Map<String, String> headers, Map<String, String> params, Map<String, String> paths, Integer timeout) { String resultString = ""; CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; InputStream content = null; BufferedReader in = null; try { // 1.創(chuàng)建http post請(qǐng)求 HttpPost httpPost = new HttpPost(url); // 2.設(shè)置超時(shí)時(shí)間 int timeoutTmp = DEFULT_TIMEOUT; if (timeout != null) { timeoutTmp = timeout; } RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp) .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build(); httpPost.setConfig(requestConfig); // 3.設(shè)置文件信息 // HttpMultipartMode.RFC6532參數(shù)的設(shè)定是為避免文件名為中文時(shí)亂碼 MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532); builder.setCharset(Charset.forName("UTF-8")); // 上傳文件的路徑 for (Map.Entry<String, String> m : paths.entrySet()) { File file = new File(m.getValue() + File.separator + m.getKey()); builder.addBinaryBody("files", file, ContentType.MULTIPART_FORM_DATA, m.getKey()); } // 4.設(shè)置參數(shù)信息 ContentType contentType = ContentType.create("text/plain", Charset.forName("UTF-8")); for (Map.Entry<String, String> param : params.entrySet()) { builder.addTextBody(param.getKey(), param.getValue(), contentType); } HttpEntity entity = builder.build(); httpPost.setEntity(entity); // 5.設(shè)置頭信息 if (headers != null) { for (String key : headers.keySet()) { httpPost.setHeader(key, headers.get(key)); } } // 6.執(zhí)行http請(qǐng)求 response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8); } } catch (Exception e) { logger.error("上傳文件失?。?, e); } finally { try { if (null != httpClient) { httpClient.close(); } } catch (IOException e) { logger.error("關(guān)閉httpClient異常" + e.toString(), e); } try { if (null != content) { content.close(); } } catch (IOException e) { logger.error("關(guān)閉content異常" + e.toString(), e); } try { if (null != in) { in.close(); } } catch (IOException e) { logger.error("關(guān)閉in異常" + e.toString(), e); } } return resultString; }
3、擴(kuò)展
上面的工具類,方法都攜帶了token和超時(shí)時(shí)間,假如接口用不到可以做接口拓展。例如:
/** * 調(diào)用http get請(qǐng)求 * * @param url * @param params * @return */ public static String doGet(String url, Map<String, Object> params) { return doGet(url, null, params, null); }
如果涉及到put請(qǐng)求和delete請(qǐng)求,跟上面都差不多,只不過創(chuàng)建請(qǐng)求的時(shí)候改為:
HttpDelete httpDelete = new HttpDelete(); HttpPut httpPut = new HttpPut();
到此這篇關(guān)于HttpClient詳細(xì)使用示例的文章就介紹到這了,更多相關(guān)HttpClient使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
圖文詳解如何將java編寫的程序轉(zhuǎn)為exe文件
我們寫的程序,要讓小伙伴打開即用,可以將java程序生成可執(zhí)行文件,下面這篇文章主要給大家介紹了關(guān)于一步步教你如何將java編寫的程序轉(zhuǎn)為exe文件的相關(guān)資料,需要的朋友可以參考下2023-01-01詳解Java8如何使用Lambda表達(dá)式進(jìn)行比較
Lambda表達(dá)式,也可稱為閉包,是java8的新特性,作用是取代大部分內(nèi)部類,優(yōu)化java代碼結(jié)構(gòu),讓代碼變得更加簡(jiǎn)潔緊湊。本文將利用Lambda表達(dá)式進(jìn)行排序比較,需要的可以參考一下2022-01-01java基于ConcurrentHashMap設(shè)計(jì)細(xì)粒度實(shí)現(xiàn)代碼
這篇文章主要介紹了java基于ConcurrentHashMap設(shè)計(jì)細(xì)粒度實(shí)現(xiàn)代碼,通過ConcurrentHashMap實(shí)現(xiàn)細(xì)粒度,具有一定參考價(jià)值,需要的朋友可以了解。2017-10-10使用@value注解取不到application.xml配置文件中的值問題
這篇文章主要介紹了使用@value注解取不到application.xml配置文件中的值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java實(shí)現(xiàn)清理DNS Cache的方法
這篇文章主要介紹了java實(shí)現(xiàn)清理DNS Cache的方法,分析了幾種常用的清理方法,并給出了反射清理的完整實(shí)例,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01Java生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)
下面小編就為大家?guī)硪黄狫ava生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解
這篇文章主要介紹了Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09