Java HttpClient用法的示例詳解
1、導(dǎo)入依賴(lài)
<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、使用工具類(lèi)
該工具類(lèi)將get請(qǐng)求和post請(qǐng)求當(dāng)中幾種傳參方式都寫(xiě)了,其中有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秒
/**
* 可以訪問(wèn) 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;
}
/**
* 通過(guò)httpClient上傳文件
*
* @param url 請(qǐng)求的URL
* @param headers 請(qǐng)求頭參數(shù)
* @param path 文件路徑
* @param fileName 文件名稱(chēng)
* @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;
}
}
/**
* 通過(guò)httpClient批量上傳文件
*
* @param url 請(qǐng)求的URL
* @param headers 請(qǐng)求頭參數(shù)
* @param params 參數(shù)
* @param paths 文件路徑(key文件名稱(chēng),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ò)展
上面的工具類(lèi),方法都攜帶了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)求,跟上面都差不多,只不過(guò)創(chuàng)建請(qǐng)求的時(shí)候改為:
HttpDelete httpDelete = new HttpDelete(); HttpPut httpPut = new HttpPut();
到此這篇關(guān)于Java HttpClient用法的示例詳解的文章就介紹到這了,更多相關(guān)Java HttpClient內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)多線程斷點(diǎn)下載實(shí)例代碼(下載過(guò)程中可以暫停)
線程可以理解為下載的通道,一個(gè)線程就是一個(gè)文件的下載通道,多線程也就是同時(shí)開(kāi)啟好幾個(gè)下載通道,Java實(shí)現(xiàn)多線程斷點(diǎn)下載實(shí)例代碼(下載過(guò)程中可以暫停),有興趣的可以了解一下。2016-12-12
mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作
這篇文章主要介紹了mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
java設(shè)計(jì)模式學(xué)習(xí)之代理模式
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式學(xué)習(xí)之代理模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Spring防止重復(fù)點(diǎn)擊的兩種實(shí)現(xiàn)方法
頁(yè)面重復(fù)提交導(dǎo)致的問(wèn)題就是數(shù)據(jù)被重復(fù)保存,我們經(jīng)常會(huì)誤觸點(diǎn)擊兩次,所以本文小編給大家介紹了Spring防止重復(fù)點(diǎn)擊的兩種實(shí)現(xiàn)方法,需要的朋友可以參考下2025-01-01
java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作
這篇文章主要介紹了java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
詳解設(shè)計(jì)模式中的proxy代理模式及在Java程序中的實(shí)現(xiàn)
代理模式主要分為靜態(tài)代理和動(dòng)態(tài)代理,使客戶(hù)端方面的使用者通過(guò)設(shè)置的代理來(lái)操作對(duì)象,下面來(lái)詳解設(shè)計(jì)模式中的proxy代理模式及在Java程序中的實(shí)現(xiàn)2016-05-05
三行Java代碼實(shí)現(xiàn)計(jì)算多邊形的幾何中心點(diǎn)
因?yàn)楣ぷ餍枰?jì)算采煤機(jī)工作面的中心點(diǎn),如果套用數(shù)學(xué)的計(jì)算公式,用java去實(shí)現(xiàn),太麻煩了。本文將利用java幾何計(jì)算的工具包,幾行代碼就能求出多變形的中心,簡(jiǎn)直yyds!還不快跟隨小編一起學(xué)起來(lái)2022-10-10
Java實(shí)現(xiàn)連接kubernates集群的兩種方式詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)連接kubernates集群的兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

