HttpUtils——助力高效网络通信

2023-12-20 14:20

本文主要是介绍HttpUtils——助力高效网络通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可:

1、创建HttpClient对象。
2、创建请求方法的实例,并指定请求URL。如果需要发送GET请求,
创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3、如果需要发送请求参数,可调用HttpGetHttpPost
共同的setParams(HttpParams params)方法来添加请求参数;
对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)
方法来设置请求参数。
4、调用HttpClient对象的execute(HttpUriRequest request)
发送请求,该方法返回一个HttpResponse5、调用HttpResponsegetAllHeaders()getHeaders(String name)
等方法可获取服务器的响应头;调用HttpResponsegetEntity()方法可获取HttpEntity对象,
该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6、释放连接。无论执行方法是否成功,都必须释放连接

引入依赖

  <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>

工具类

@Slf4j
public class HttpUtils {public static String defaultEncoding = "utf-8";/*** 发送http post请求,并返回响应实体** @param url 请求地址* @return url响应实体*/public static String postRequest(String url) {return postRequest(url, null, null);}/*** <p>方法名: postRequest</p>* <p>描述: 发送httpPost请求</p>** @param url* @param params* @return*/public static String postRequest(String url, Map<String, Object> params) {return postRequest(url, null, params);}/*** 发送http post请求,并返回响应实体** @param url     访问的url* @param headers 请求需要添加的请求头* @param params  请求参数* @return*/public static String postRequest(String url, Map<String, String> headers,Map<String, Object> params) {String result = null;CloseableHttpClient httpClient = buildHttpClient();HttpPost httpPost = new HttpPost(url);if (null != headers && headers.size() > 0) {for (Entry<String, String> entry : headers.entrySet()) {String key = entry.getKey();String value = entry.getValue();httpPost.addHeader(new BasicHeader(key, value));}}if(isJSON(params.toString())){/*** json格式*/StringEntity requestEntity = new StringEntity(params.toString(), "utf-8");requestEntity.setContentEncoding("UTF-8");httpPost.setHeader("Content-type", "application/json");httpPost.setEntity(requestEntity);}else{/*** 名称值对节点类型*/if (null != params && params.size() > 0) {List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());for (Map.Entry<String, Object> entry : params.entrySet()) {NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());pairList.add(pair);}httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName(defaultEncoding)));}}try {CloseableHttpResponse response = httpClient.execute(httpPost);try {HttpEntity entity = response.getEntity();if (entity != null) {log.info("【POST请求信息】,请求地址:{},请求参数:{}", url, params);result = EntityUtils.toString(entity, Charset.forName(defaultEncoding));log.info("【POST请求信息】,请求地址:{},请求参数:{},返回结果:{}", url, params,result);}} finally {response.close();}} catch (Exception ex) {ex.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}/*** 发送http get请求** @param url 请求url* @return url返回内容*/public static String getRequest(String url) {return getRequest(url, null);}/*** 发送http get请求** @param url    请求的url* @param params 请求的参数* @return*/public static String getRequest(String url, Map<String, Object> params) {return getRequest(url, null, params);}/*** 发送http get请求** @param url        请求的url* @param headersMap 请求头* @param params     请求的参数* @return*/public static String getRequest(String url, Map<String, String> headersMap, Map<String, Object> params) {String result = null;CloseableHttpClient httpClient = buildHttpClient();try {String apiUrl = url;if (null != params && params.size() > 0) {StringBuffer param = new StringBuffer();int i = 0;for (String key : params.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(params.get(key));i++;}apiUrl += param;}HttpGet httpGet = new HttpGet(apiUrl);if (null != headersMap && headersMap.size() > 0) {for (Entry<String, String> entry : headersMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();httpGet.addHeader(new BasicHeader(key, value));}}CloseableHttpResponse response = httpClient.execute(httpGet);try {HttpEntity entity = response.getEntity();if (null != entity) {log.info("【GET请求信息】,请求地址:{},请求参数:{}", url, params);result = EntityUtils.toString(entity, defaultEncoding);log.info("【GET请求信息】,请求地址:{},请求参数:{},返回结果:{}", url, params,result);}} finally {response.close();}} catch (ClientProtocolException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}/*** 创建httpclient,支持http、https** @return*/public static CloseableHttpClient buildHttpClient() {try {RegistryBuilder<ConnectionSocketFactory> builder = RegistryBuilder.create();ConnectionSocketFactory factory = new PlainConnectionSocketFactory();builder.register("http", factory);KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());SSLContext context = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, new TrustStrategy() {public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {return true;}}).build();LayeredConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(context,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);builder.register("https", sslFactory);Registry<ConnectionSocketFactory> registry = builder.build();PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(registry);ConnectionConfig connConfig = ConnectionConfig.custom().setCharset(Charset.forName(defaultEncoding)).build();SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(100000).build();manager.setDefaultConnectionConfig(connConfig);manager.setDefaultSocketConfig(socketConfig);return HttpClientBuilder.create().setConnectionManager(manager).build();} catch (KeyStoreException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}public static boolean isJSON(String str) {boolean result = false;try {Object obj=JSON.parse(str);result = true;} catch (Exception e) {result=false;}return result;}public static void main(String[] args) {String url1 = "http://192.168.56.101:8196/test/get1";String result = HttpUtils.getRequest(url1);System.out.println(result);String url2 = "http://192.168.56.101:8196/test/get2";Map<String, Object> params = new HashMap<>();params.put("name", "一安未来1");params.put("addr", "北京1");String result2 = HttpUtils.postRequest(url2, null,params);System.out.println(result2);String url3 = "http://192.168.56.101:8196/test/get3";JSONObject jsonObject = new JSONObject();jsonObject.put("name", "一安未来2");jsonObject.put("addr", "北京2");String result3 = HttpUtils.postRequest(url3, null,jsonObject);System.out.println(result3);}GET请求信息】,请求地址:http://192.168.56.101:8196/test/get1,请求参数:nullGET请求信息】,请求地址:https://192.168.56.101:8196/test/get1,请求参数:null,返回结果:{"result":"success"}POST请求信息】,请求地址:http://192.168.56.101:8196/test/get2,请求参数:{name=一安未来1, addr=北京1}POST请求信息】,请求地址:http://192.168.56.101:8196/test/get2,请求参数:{name=一安未来1, addr=北京1},返回结果:{"name":"一安未来1","addr":"北京1"}POST请求信息】,请求地址:http://192.168.56.101:8196/test/get3,请求参数:{"name":"一安未来2","addr":"北京2"}POST请求信息】,请求地址:http://192.168.56.101:8196/test/get3,请求参数:{"name":"一安未来2","addr":"北京2"},返回结果:{"name":"一安未来2","addr":"北京2"}}

接口类

@RestController
public class TestController {@GetMapping("get1")public String test1(){return "{\"result\":\"success\"}";}@PostMapping("get2")private Map<String, Object> test2(@RequestParam Map<String,Object> map){return map;}@PostMapping("get3")private Map test3(@RequestBody Map<String,Object> map){return map;}}

这篇关于HttpUtils——助力高效网络通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/516355

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.