HttpClient工具类
时间:2022-07-25
本文章向大家介绍HttpClient工具类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
基于restTemplate的httpClient通用工具类。
方案
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.HashMap;
import java.util.Map;
import static org.springframework.http.HttpMethod.*;
/**
* http client工具类
*
* @author: EarthChen
* @date: 2018/04/01
*/
@Slf4j
public class HttpClientUtil {
/**
* 携带请求头不携带get参数的get方法
*
* @param url
* @param headerMap
* @param clazz
* @param <T>
* @return
*/
public static <T> T doGetWithHeader(String url,
Map<String, String> headerMap,
Class<T> clazz) {
return get(url, headerMap, new HashMap<>(), clazz);
}
/**
* 携带请求头携带get参数的get方法
*
* @param url
* @param headerMap
* @param paramMap
* @param clazz
* @param <T>
* @return
*/
public static <T> T doGetWithHeader(String url,
Map<String, String> headerMap,
Map<String, String> paramMap,
Class<T> clazz) {
return get(url, headerMap, paramMap, clazz);
}
/**
* 不携带请求头不携带get参数的get方法
*
* @param url
* @param clazz
* @param <T>
* @return
*/
public static <T> T doGet(String url,
Class<T> clazz) {
return get(url, new HashMap<>(), new HashMap<>(), clazz);
}
/**
* 不携带请求头携带get参数的get方法
*
* @param url
* @param paramMap
* @param clazz
* @param <T>
* @return
*/
public static <T> T doGet(String url,
Map<String, String> paramMap,
Class<T> clazz) {
return get(url, new HashMap<>(), paramMap, clazz);
}
private static <T> T get(String url,
Map<String, String> headerMap,
Map<String, String> paramMap,
Class<T> clazz) {
if (!paramMap.isEmpty()) {
StringBuilder urlBuilder = new StringBuilder(url);
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
String name = entry.getKey();
urlBuilder.append("?").append(name).append("={").append(name).append("}");
}
url = urlBuilder.toString();
}
// 设置请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
if (!headerMap.isEmpty()) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.add(entry.getKey(), entry.getValue());
}
}
RestTemplate restTemplate = new RestTemplate();
HttpEntity<String> entity = new HttpEntity<>(null, headers);
ResponseEntity<T> responseEntity = null;
try {
responseEntity = restTemplate.exchange(url, GET, entity, clazz, paramMap);
} catch (HttpClientErrorException e) {
log.error("url={},request={}请求出错", url, entity);
}
if (responseEntity == null) {
return null;
}
return responseEntity.getBody();
}
/**
* 携带header的json post请求
*
* @param <T>
* @param url
* @param headerMap
* @param requestJson
* @param clazz
* @return
*/
public static <T> T doPostJsonWithHeader(String url,
Map<String, String> headerMap,
String requestJson,
Class<T> clazz) {
return postJson(url, headerMap, requestJson, clazz);
}
/**
* 不携带header的json post请求
*
* @param url
* @param requestJson
* @param clazz
* @param <T>
* @return
*/
public static <T> T doPostJson(String url,
String requestJson,
Class<T> clazz) {
return postJson(url, new HashMap<>(), requestJson, clazz);
}
/**
* post请求
* <p>
* json类型
*
* @param url
* @param headerMap
* @param requestJson
* @param clazz
* @param <T>
* @return
*/
private static <T> T postJson(String url,
Map<String, String> headerMap,
String requestJson,
Class<T> clazz) {
// //采用绕过验证的方式处理https请求
// SSLContext sslContext = createIgnoreVerifySSL();
//
// SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
//
// CloseableHttpClient httpClient = HttpClients.custom()
// .setSSLSocketFactory(csf)
// .build();
//
// HttpComponentsClientHttpRequestFactory requestFactory =
// new HttpComponentsClientHttpRequestFactory();
//
// requestFactory.setHttpClient(httpClient);
//
// RestTemplate restTemplate = new RestTemplate(requestFactory);
RestTemplate restTemplate = new RestTemplate();
// 设置请求头
HttpHeaders headers = new HttpHeaders();
// 设置请求类型为json
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
if (!headerMap.isEmpty()) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.add(entry.getKey(), entry.getValue());
}
}
HttpEntity<String> entity = new HttpEntity<>(requestJson, headers);
ResponseEntity<T> responseEntity = null;
try {
responseEntity = restTemplate.postForEntity(url, entity, clazz);
} catch (HttpClientErrorException e) {
log.error("url={},request={}请求出错", url, entity);
}
if (responseEntity == null) {
return null;
}
return responseEntity.getBody();
}
/**
* 表单提交post请求
* <p>
* 响应正常时,返回对象,否则返回null
*
* @param url url
* @param paramMap 表单参数
* @param clazz
* @param <T>
* @return
*/
public static <T> T doPostForm(String url,
MultiValueMap<String, String> paramMap,
Class<T> clazz) {
return postForm(url, new HashMap<>(), paramMap, clazz);
}
/**
* 表单提交并携带header
*
* @param url
* @param headerMap
* @param paramMap
* @param clazz
* @param <T>
* @return
*/
public static <T> T doPostFormWithHeader(String url,
Map<String, String> headerMap,
MultiValueMap<String, String> paramMap,
Class<T> clazz) {
return postForm(url, headerMap, paramMap, clazz);
}
/**
* 表单提交
*
* @param url
* @param headerMap
* @param paramMap
* @param clazz
* @param <T>
* @return
*/
private static <T> T postForm(String url,
Map<String, String> headerMap,
MultiValueMap<String, String> paramMap,
Class<T> clazz) {
RestTemplate restTemplate = new RestTemplate();
// 设置请求头为表单
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
if (!headerMap.isEmpty()) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.add(entry.getKey(), entry.getValue());
}
}
// 构造请求体
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(paramMap, headers);
ResponseEntity<T> response = null;
try {
response = restTemplate.postForEntity(url, request, clazz);
} catch (HttpClientErrorException e) {
log.error("url={},request={}请求出错", url, request);
}
if (response == null) {
return null;
}
return response.getBody();
}
/**
* 绕过验证
*
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSLv3");
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sc.init(null, new TrustManager[]{trustManager}, null);
return sc;
}
}
注:
- 上述测试在ubuntu16.04 lts jdk1.8 spring boot 1.5.6.RELEASE中成功
- 上述文字皆为个人看法,如有错误或建议请及时联系我
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 给Linux增加swap内存
- 网鼎杯2018-Fakebook
- 强网杯2019-高明的黑客
- CISCN2019华北赛区Day2-HackWorld
- ZJCTF-NiZhuanSiWei
- xxe漏洞学习
- De1CTF2019-SSRFME
- BJDCTF2nd-EasyMd5
- BJDCTF2nd-fakegoogle
- java_Scanner类、Random类、ArrayList 类的使用
- 使用Python获取Oracle索引信息
- 监控Oracle数据泵状态
- MySQL MHA部署 Part 5 MHA部署指南
- MySQL MHA部署 Part 6 MHA故障转移测试
- 一步步搭建基于GTID的MySQL复制