引:记录个人使用的的工具类


package cn.fxbin.bubble.core.util;
import cn.fxbin.bubble.core.constant.CharsetPool;
import cn.fxbin.bubble.core.constant.StringPool;
import com.alibaba.fastjson.JSONObject;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.*;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
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.springframework.lang.Nullable;
import java.io.IOException;
import java.net.URI;
import java.util.*;
/**
* HttpUtils
*
* <p>
* 参见:
* <a href="#">http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html</a>
* </p>
*
* @author fxbin
* @version v1.0
* @since 2019/11/15 14:43
*/
@Slf4j
@UtilityClass
public class HttpUtils {
/**
* http get request
*
* @author fxbin
* @since 2019/11/17 18:04
* @param url url
* @return java.lang.String
*/
public String get(String url) {
return get(url, null);
}
/**
* http get request with parameter
*
* @author fxbin
* @since 2019/11/17 18:04
* @param url url
* @param object object
* @return java.lang.String
*/
public String get(String url, @Nullable Object object) {
return request(url, HttpGet.METHOD_NAME, object);
}
/**
* http post request
*
* @author fxbin
* @since 2019/11/17 18:19
* @param url url
* @return java.lang.String
*/
public String post(String url) {
return post(url, null);
}
/**
* http post request with parameter
*
* @author fxbin
* @since 2019/11/17 18:19
* @param url url
* @param object request parameter
* @return java.lang.String
*/
public String post(String url, @Nullable Object object) {
return request(url, HttpPost.METHOD_NAME, object);
}
/**
* request
*
* @author fxbin
* @since 2019/11/17 18:03
* @param url url
* @param method http method
* @param object object
* @return java.lang.String
*/
private String request(String url, String method, Object object) {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
RequestBuilder requestBuilder = RequestBuilder
.create(method)
.setConfig(getRequestConfig())
.setUri(buildUri(url, object));
if (ObjectUtils.isNotEmpty(object) && object instanceof String) {
StringEntity entity = null;
if (JsonUtils.isJsonString(String.valueOf(object))) {
entity = new StringEntity(String.valueOf(object), ContentType.APPLICATION_JSON);
entity.setContentEncoding(StringPool.UTF8);
} else {
entity = new StringEntity(String.valueOf(object), ContentType.TEXT_HTML);
entity.setContentEncoding(StringPool.UTF8);
}
requestBuilder.setEntity(entity);
}
HttpUriRequest httpUriRequest = requestBuilder.build();
try (CloseableHttpResponse response = httpclient.execute(httpUriRequest)) {
HttpEntity entity = response.getEntity();
// 临时重定向, 可能性: 80 --> 443
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_TEMPORARY_REDIRECT) {
String redirectUri = response.getFirstHeader("location").getValue();
return post(redirectUri, object);
}
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 转化响应结果,并设置编码
return EntityUtils.toString(entity, StringPool.UTF8);
}
} catch (IOException e) {
log.error("CloseableHttpResponse deal with execute failed ", e);
}
} catch (Exception e) {
log.error("http request failed, url: {}", url, e);
} finally {
try {
httpclient.close();
} catch (IOException e) {
log.error("CloseableHttpClient close failed", e);
}
}
return "";
}
/**
* buildUri build uri
*
* @author fxbin
* @since 2019/11/17 18:01
* @param url http url
* @param object object
* @return java.net.URI
*/
private URI buildUri(String url, @Nullable Object object) {
try {
URI uri = new URIBuilder(url).build();
if (ObjectUtils.isNotEmpty(object)) {
List<NameValuePair> nameValuePairs = object2NameValuePairs(object);
if (CollectionUtils.isNotEmpty(nameValuePairs)) {
uri = new URIBuilder(url).addParameters(nameValuePairs).setCharset(CharsetPool.UTF_8).build();
}
}
return Optional.ofNullable(uri).orElse(new URIBuilder(url).build());
} catch (Exception e) {
log.error("build URI failed ", e);
}
return null;
}
/**
* object2NameValuePairs object parse to name value
*
* @author fxbin
* @since 2019/11/17 17:45
* @param object object
* @return java.util.List<org.apache.http.NameValuePair>
*/
private List<NameValuePair> object2NameValuePairs(@Nullable Object object) {
List<NameValuePair> nameValuePairs = new ArrayList<>();
if (ObjectUtils.isEmpty(object)) {
return nameValuePairs;
}
// java.util.Map
if (object instanceof Map) {
@SuppressWarnings("rawtypes") Map<?, ?> params = (Map) object;
params.forEach((k, v) -> {
log.info("请求参数, key:{}, value:{}", k, v);
nameValuePairs.add(new BasicNameValuePair(String.valueOf(k), String.valueOf(v)));
});
}
// com.alibaba.fastjson.JSONObject
if (object instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) object;
Set<String> keys = jsonObject.keySet();
keys.forEach(key -> {
log.info("请求参数, key:{}, value:{}", key, jsonObject.getString(key));
nameValuePairs.add(new BasicNameValuePair(key, jsonObject.getString(key)));
});
}
// else
return nameValuePairs;
}
/**
* getRequestConfig 获取请求配置:连接超时,请求超时,自动重定向配置
*
* @author fxbin
* @since 2019/11/17 17:19
* @return org.apache.http.client.config.RequestConfig
*/
private RequestConfig getRequestConfig(){
// 连接超时,请求超时,自动重定向配置
return RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT)
.setExpectContinueEnabled(true)
// 读超时 30s
.setSocketTimeout(30000)
// 链接超时 10s
.setConnectTimeout(10000)
// 链接不够用的等待时间 10s
.setConnectionRequestTimeout(10000)
// 允许自动重定向
.setRedirectsEnabled(true)
.build();
}
}


​如果问题,请联系博主说明,感谢阅读​