import org.apache.http.Consts;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.StatusLine;import org.apache.http.client.HttpResponseException;import org.apache.http.client.fluent.Request;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.utils.URIBuilder;import org.apache.http.entity.ContentType;import org.apache.http.impl.client.BasicResponseHandler;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 java.io.IOException;import java.net.URI;import java.util.ArrayList;import java.util.List;import java.util.Map;public class FluentHttpUtil { /** * 连接超时: 5秒 */ public static final int CONNECT_TIMEOUT = 5 * 1000; /** * socket超时: 1分钟 */ public static final int SOCKET_TIMEOUT = 60 * 1000; /** * 发送GET请求 * * @param url * @return * @throws Exception */ public static String sendGetRequest(String url) throws Exception { return Request.Get(url) .useExpectContinue() .connectTimeout(CONNECT_TIMEOUT) // 连接超时: 5秒 .socketTimeout(SOCKET_TIMEOUT) // socket超时: 1分钟 .execute() .returnContent() .asString(); } /** * 发送GET请求 * * @param url * @param paramMap * @return * @throws Exception */ public static String sendGetRequest(String url, Map<String, Object> paramMap) throws Exception { /* * 由于GET请求的参数都是拼装在URL地址后方,所以我们要构建一个URL,带参数 */ URIBuilder uriBuilder = new URIBuilder(url); // 1、创建httpClient CloseableHttpClient client = HttpClients.createDefault(); // 2、封装请求参数 List<NameValuePair> list = new ArrayList<>(); paramMap.forEach((k, v) -> { list.add(new BasicNameValuePair(k, v.toString())); }); // 3、转化参数// String params = EntityUtils.toString(new UrlEncodedFormEntity(list, Consts.UTF_8));// System.out.println(params); // 设置URL请求参数 uriBuilder.setParameters(list); // 构建请求URL对象 URI uri = uriBuilder.build(); // 4、创建HttpGet请求 HttpGet httpGet = new HttpGet(uri); CloseableHttpResponse response = client.execute(httpGet); // 5、获取实体 HttpEntity entity = response.getEntity(); // 将实体装成字符串 String result = EntityUtils.toString(entity, Consts.UTF_8.name()); response.close(); return result; } /** * 发送POST请求,参数为JSON格式 * * @param url * @param param * @return * @throws Exception */ public static String sendPostJson(String url, String param) throws Exception { return Request.Post(url) .useExpectContinue() .connectTimeout(CONNECT_TIMEOUT) // 连接超时: 5秒 .socketTimeout(SOCKET_TIMEOUT) // socket超时: 1分钟 .bodyString(param, ContentType.APPLICATION_JSON) .execute() .returnContent() .asString(); } /** * 发送POST请求,参数为JSON格式 * * @param url * @param param * @param returnBodyOnError * 响应状态码大于300时,是否返回body. true表示返回, false表示抛出异常 * @return * @throws Exception */ public static String sendPostJson(String url, String param, boolean returnBodyOnError) throws Exception { return Request.Post(url) .useExpectContinue() .connectTimeout(CONNECT_TIMEOUT) // 连接超时: 5秒 .socketTimeout(SOCKET_TIMEOUT) // socket超时: 1分钟 .bodyString(param, ContentType.APPLICATION_JSON) .execute() .handleResponse(new BasicResponseHandler() { @Override public String handleResponse(HttpResponse response) throws HttpResponseException, IOException { final StatusLine statusLine = response.getStatusLine(); final HttpEntity entity = response.getEntity(); if (!returnBodyOnError && statusLine.getStatusCode() >= 300) { EntityUtils.consume(entity); throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase()); } return entity == null ? null : handleEntity(entity); } }); } /** * 发送PUT请求,参数为JSON格式 * * @param url * @param param * @return * @throws Exception */ public static String sendPutJson(String url, String param) throws Exception { return Request.Put(url) .useExpectContinue() .connectTimeout(CONNECT_TIMEOUT) // 连接超时: 5秒 .socketTimeout(SOCKET_TIMEOUT) // socket超时: 1分钟 .bodyString(param, ContentType.APPLICATION_JSON) .execute() .returnContent() .asString(); }}
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>fluent-hc</artifactId> </dependency>