Java原生HttpClient的使用详解

网友投稿 392 2022-08-05


Java原生HttpClient的使用详解

目录1.信任证书管理类2.HttpClient类3.发送请求工具类4.测试

提到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 sendGet(String urlStr, String cookieStr) throws Exception {

HashMap hashMap = new HashMap<>();

hashMap.put("Cookie",cookieStr);

return sendGet(urlStr,hashMap);

}

public static HttpResponse sendGet(String urlStr, Map 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 result = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));

return result;

}

private static HttpResponse 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 result = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));

return result;

}

public static HttpResponse sendFormPost(String urlStr, http://String formStr, String cookieStr) throws Exception {

return sendPost("application/x-www-form-urlencoded;charset=utf-8", urlStr, formStr, cookieStr);

}

public static HttpResponse 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的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:例题详解Java dfs与记忆化搜索和分治递归算法的使用
下一篇:四个实例超详细讲解Java 贪心和枚举的特点与使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~