java实现http/https请求

在Java中,有多种方式可以实现HTTP或HTTPS请求。以下是使用第三方库Apache HttpClient来实现HTTP/HTTPS请求的工具类。

优势和特点

URIBuilder的优势在于它提供了一种简单而灵活的方式来构造URI,帮助开发人员避免手动拼接URI字符串,并处理参数的编码和转义。此外,URIBuilder还提供了其他一些有用的方法,例如添加路径段、设置查询字符串等。这使得URI的构建过程更加清晰和易于管理。

使用 Apache HttpClient

要使用Apache HttpClient,你首先需要将HttpClient库添加到你的项目中。如果你使用Maven,可以在pom.xml中添加以下依赖:

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.5.13</version> <!-- 使用时请检查最新版本 -->

</dependency>

然后,你可以使用以下代码示例来发送HTTP请求:

import org.apache.commons.collections.MapUtils;

import org.apache.http.HttpEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.utils.URIBuilder;

import org.apache.http.conn.ssl.NoopHostnameVerifier;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.ssl.SSLContextBuilder;

import org.apache.http.util.EntityUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.SSLContext;

import java.io.IOException;

import java.security.KeyManagementException;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.util.HashMap;

import java.util.Map;

public class HttpsUtils {

private static Logger logger = LoggerFactory.getLogger(HttpsUtils.class);

static CloseableHttpClient httpClient;

static CloseableHttpResponse httpResponse;

public static CloseableHttpClient createSSLClientDefault() {

try {

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

// 信任所有

public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {

return true;

}

}).build();

HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);

return HttpClients.custom().setSSLSocketFactory(sslsf).build();

} catch (KeyManagementException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (KeyStoreException e) {

e.printStackTrace();

}

return HttpClients.createDefault();

}

/**

* 发送https||http get请求

*

* @throws Exception

*/

public static String sendByHttpGet(Map<String, Object> params, String url) {

try {

URIBuilder uriBuilder = new URIBuilder(url);

if(MapUtils.isNotEmpty(params)) {

for (Map.Entry<String, Object> entry : params.entrySet()) {

uriBuilder.setParameter(entry.getKey(), entry.getValue().toString());

}

}

HttpGet httpGet = new HttpGet(uriBuilder.build());

httpGet.addHeader("Content-type", "application/json; charset=utf-8");

httpGet.setHeader("Accept", "application/json");

httpClient = HttpsUtils.createSSLClientDefault();

httpResponse = httpClient.execute(httpGet);

HttpEntity httpEntity = httpResponse.getEntity();

if (httpEntity != null) {

String jsObject = EntityUtils.toString(httpEntity, "UTF-8");

return jsObject;

} else {

return null;

}

} catch (Exception e) {

e.printStackTrace();

logger.error("description : {``{}} ,details : {``{}}", "请求异常", e.getStackTrace());

} finally {

try {

httpResponse.close();

httpClient.close();

} catch (IOException e) {

logger.error("description : {``{}} ,details : {``{}}", "请求流关闭异常", e.getStackTrace());

e.printStackTrace();

}

}

return null;

}

/**

* 发送https||http get请求

*

* @throws Exception

*/

public static byte[] sendByteByHttpGet(Map<String, Object> params, String url) {

try {

URIBuilder uriBuilder = new URIBuilder(url);

if(MapUtils.isNotEmpty(params)) {

for (Map.Entry<String, Object> entry : params.entrySet()) {

uriBuilder.setParameter(entry.getKey(), entry.getValue().toString());

}

}

HttpGet httpGet = new HttpGet(uriBuilder.build());

httpGet.addHeader("Content-type", "application/json; charset=utf-8");

httpGet.setHeader("Accept", "application/json");

httpClient = HttpsUtils.createSSLClientDefault();

httpResponse = httpClient.execute(httpGet);

HttpEntity httpEntity = httpResponse.getEntity();

if (httpEntity != null) {

byte[] bytes = EntityUtils.toByteArray(httpEntity);

return bytes;

} else {

return new byte[0];

}

} catch (Exception e) {

e.printStackTrace();

logger.error("description : {``{}} ,details : {``{}}", "读取二进制保存的图片异常", e.getStackTrace());

} finally {

try {

httpResponse.close();

httpClient.close();

} catch (IOException e) {

e.printStackTrace();

logger.error("description : {``{}} ,details : {``{}}", "读取二进制保存的图片关闭流时异常", e.getStackTrace());

}

}

return new byte[0];

}

}

相关推荐
架构源启21 分钟前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
触底反弹24 分钟前
前后端通信不是魔法,是 HTTP 协议、数据格式和浏览器安全机制共同演奏的交响曲
http·https·浏览器
大模型码小白4 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜5 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码5 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉5 小时前
手撕小汇总
java·前端·javascript
唐青枫6 小时前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
脱胎换骨-军哥7 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫7 小时前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
小白说大模型7 小时前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain