Java原生HttpClient的使用详解
作者:农民工老王 时间:2022-06-04 16:29:49
提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的OkHttp。而在Java11之前,原生Java对此的支持还是比较差的,虽然可以HttpURLConnection、URLConnection、Socket等自带的类发送请求,但是操作比较复杂。直到Java11发布,Java本身也自带了HttpClient。自2020年初,我就在开发中广泛使用了这一新特性,感觉使用体验也还可以。现总结成博客,供大家参考。
1.信任证书管理类
package cn.wja.component;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public static TrustManager[] getTrustManagers() {
TrustManager[] trustAllCertificates = {new MyX509TrustManager()};
return trustAllCertificates;
}
}
2.HttpClient类
package cn.wja.component;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.TrustManager;
import java.net.http.HttpClient;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.time.Duration;
public class MyHttpClient {
static public HttpClient getClient() throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustManagers = MyX509TrustManager.getTrustManagers();
var timeoutInSeconds = 60;
SSLParameters sslParams = new SSLParameters();
sslParams.setEndpointIdentificationAlgorithm("");
SSLContext sc = SSLContext.getInstance("SSL");
//取消主机名验证
System.setProperty("jdk.internal.httpclient.disableHostnameVerification", "true");
sc.init(null, trustManagers, new SecureRandom());
return HttpClient.newBuilder()
.connectTimeout(Duration.ofMillis(timeoutInSeconds * 1000))
.sslContext(sc)
.sslParameters(sslParams)
.followRedirects(HttpClient.Redirect.NEVER)
.version(HttpClient.Version.HTTP_2)
.build();
}
}
3.发送请求工具类
package cn.wja.util;
import cn.wja.component.MyHttpClient;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8;
public class HttpUtils {
public static HttpResponse<String> sendGet(String urlStr, String cookieStr) throws Exception {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("Cookie",cookieStr);
return sendGet(urlStr,hashMap);
}
public static HttpResponse<String> sendGet(String urlStr, Map<String,String> headers) throws KeyManagementException, NoSuchAlgorithmException, IOException, InterruptedException {
HttpClient client = MyHttpClient.getClient();
HttpRequest.Builder reqBuilder = getReqBuilder(urlStr);
reqBuilder.GET();
for (String key:headers.keySet()){
reqBuilder.header(key, headers.get(key));
}
HttpRequest request = reqBuilder.build();
HttpResponse<String> result = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
return result;
}
private static HttpResponse<String> sendPost(String contentType, String urlStr, String bodyStr, String cookieStr) throws Exception {
HttpClient client = MyHttpClient.getClient();
HttpRequest.Builder reqBuilder = getReqBuilder(urlStr);
HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(bodyStr);
reqBuilder.header("Content-Type", contentType)
.POST(bodyPublisher)
.header("Cookie", cookieStr);
HttpRequest request = reqBuilder.build();
HttpResponse<String> result = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
return result;
}
public static HttpResponse<String> sendFormPost(String urlStr, String formStr, String cookieStr) throws Exception {
return sendPost("application/x-www-form-urlencoded;charset=utf-8", urlStr, formStr, cookieStr);
}
public static HttpResponse<String> sendJsonPost(String urlStr, String jsonStr, String cookieStr) throws Exception {
return sendPost("application/json;charset=utf-8", urlStr, jsonStr, cookieStr);
}
public static HttpRequest.Builder getReqBuilder(String urlStr) {
return HttpRequest.newBuilder()
.uri(URI.create(urlStr))
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0");
}
}
4.测试
测试表明,通过调用工具类方法,可以直接发送GET请求和带Form表单/Json的POST请求。如果您要发送其他形式的HTTP请求,也可以参照上述代码自行实现。
来源:https://tomcat.blog.csdn.net/article/details/123157836
标签:Java,原生,HttpClient
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
关于idea更新到2020.2.3无法创建web项目原因 library is not specified
2022-11-24 10:13:28
![](https://img.aspxhome.com/file/2023/6/64006_0s.png)
FeignClient如何脱离eureka自定义URL
2022-08-27 01:37:25
C# wpf 无边框窗口添加阴影效果的实现
2023-11-05 01:15:09
![](https://img.aspxhome.com/file/2023/0/119470_0s.png)
解析Spring Boot内嵌tomcat关于getServletContext().getRealPath获取得到临时路径的问题
2023-08-28 07:44:11
![](https://img.aspxhome.com/file/2023/4/99894_0s.png)
Java实现简易扑克牌游戏的完整实例
2022-10-08 14:09:18
![](https://img.aspxhome.com/file/2023/0/63490_0s.png)
在java中ArrayList集合底层的扩容原理
2023-12-19 11:12:15
![](https://img.aspxhome.com/file/2023/8/67428_0s.png)
c# wpf如何使用Blend工具绘制Control样式
2022-10-26 09:35:25
![](https://img.aspxhome.com/file/2023/5/69235_0s.gif)
java 读取网页内容的实例详解
2023-11-27 22:38:11
java多线程-同步块实例讲解
2022-06-21 02:10:41
通过JDK源码角度分析Long类详解
2022-03-11 19:26:38
Java反射机制在Spring IOC中的应用详解
2023-11-10 14:09:32
java实现手写一个简单版的线程池
2022-09-29 04:59:32
![](https://img.aspxhome.com/file/2023/6/62726_0s.jpg)
C#文件上传与下载的实现方法
2023-08-19 04:18:50
Spring启动时实现初始化有哪些方式?
2023-09-20 18:25:57
分享Android仿刮奖效果控件
2021-12-15 16:00:16
![](https://img.aspxhome.com/file/2023/6/89556_0s.jpg)
java利用mybatis拦截器统计sql执行时间示例
2021-08-22 11:35:41
在IDEA中 实现给main方法附带参数的操作
2022-10-23 14:42:03
![](https://img.aspxhome.com/file/2023/7/71237_0s.jpg)
基于C#实现屏幕取色器的示例详解
2021-06-26 08:58:05
![](https://img.aspxhome.com/file/2023/1/116501_0s.png)
SpringBoot项目中的多数据源支持的方法
2022-01-12 03:42:19
Java循环对bean的属性进行赋值的实现
2023-01-27 10:18:05