Java原生HttpClient的使用详解
提到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请求,也可以参照上述代码自行实现。
以上就是Java原生HttpClient的使用详解的详细内容,更多关于Java HttpClient的资料请关注脚本之家其它相关文章!
相关文章
mybatis查询到了数据,但是实体类个别字段为null问题
这篇文章主要介绍了mybatis查询到了数据,但是实体类个别字段为null问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-01-01
关于Intellij idea 报错:Error : java 不支持发行版本5的问题
这篇文章主要介绍了关于Intellij idea 报错:Error : java 不支持发行版本5的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-02-02
Java 多线程并发AbstractQueuedSynchronizer详情
这篇文章主要介绍了Java 多线程并发AbstractQueuedSynchronizer详情,文章围绕主题展开想象的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下2022-06-06


最新评论