当前位置: 首页 > news >正文

HttpUtils工具类

作为Java开发程序员,需要我们经常写一些工具类来简化开发过程,我们自己肯定写过或者用过HttpUtils用来发送http请求,但是每次手写太繁琐了,于是就按照标准写了一个Http工具类,现在分享出来。

1.HTTP请求简介

HTTP(Hypertest Transfer Protocol)是用于传输像HTML这样的超文本文件的应用层协议。它被设计用于WEB浏览器端和WEB服务端的交互,但也有其它用途。HTTP遵循经典的client-server模型,客户端发起请求尝试建立连接,然后等待服务端的应答。HTTP是无状态协议,这意味着服务端在两次请求间不会记录任何状态。

2.Http请求四要素

一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。

1、请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

2、请求头部

HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。

3、空行

它的作用是通过一个空行,告诉服务器请求头部到此为止。

4、请求数据

若方法字段是GET,则此项为空,没有数据。若方法字段是POST,则通常来说此处放置的就是要提交的数据。

HttpUtils的代码

package com.zuoan.utils;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class HttpUtil {private static final CloseableHttpClient httpclient = HttpClients.createDefault();private static final String userAgent = "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36";/*** 发送HttpGet请求*/public static String sendGet(String url, String token) {String result = null;CloseableHttpResponse response = null;try {URIBuilder uriBuilder = new URIBuilder(url);HttpGet httpGet = new HttpGet(url);httpGet.setHeader("User-Agent", userAgent);httpGet.setHeader("Authorization", "token " + token);response = httpclient.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {result = EntityUtils.toString(entity);}} catch (Exception e) {log.error("处理失败 {}" + e);e.printStackTrace();} finally {if (response != null) {try {response.close();} catch (IOException e) {log.error(e.getMessage());}}}return result;}/*** 发送HttpGet请求,参数为map格式*/public static String sendGet(String url, Map<String, String> map) {String result = null;CloseableHttpResponse response = null;try {URIBuilder uriBuilder = new URIBuilder(url);for (Map.Entry<String, String> entry : map.entrySet()) {uriBuilder.setParameter(entry.getKey(), entry.getValue());}HttpGet httpGet = new HttpGet(uriBuilder.build());httpGet.setHeader("User-Agent", userAgent);response = httpclient.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {result = EntityUtils.toString(entity);}} catch (Exception e) {log.error("处理失败 {}" + e);e.printStackTrace();} finally {if (response != null) {try {response.close();} catch (IOException e) {log.error(e.getMessage());}}}return result;}/*** 发送HttpPost请求,参数为map*/public static String sendPost(String url, Map<String, String> map) {// 设置参数List<NameValuePair> formparams = new ArrayList<NameValuePair>();for (Map.Entry<String, String> entry : map.entrySet()) {formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}// 编码UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);// 设置content-typeformEntity.setContentType("application/json");// 取得HttpPost对象HttpPost httpPost = new HttpPost(url);// 防止被当成攻击添加的httpPost.setHeader("User-Agent", userAgent);// 接收参数设置httpPost.setHeader("Accept", "application/json");// 参数放入EntityhttpPost.setEntity(formEntity);CloseableHttpResponse response = null;String result = null;try {// 执行post请求response = httpclient.execute(httpPost);// 得到entityHttpEntity entity = response.getEntity();// 得到字符串result = EntityUtils.toString(entity);} catch (IOException e) {log.error(e.getMessage());} finally {if (response != null) {try {response.close();} catch (IOException e) {log.error(e.getMessage());}}}return result;}/*** 发送HttpPost请求,参数为json字符串*/public static String sendPost(String url, String jsonStr) {String result = null;// 字符串编码StringEntity entity = new StringEntity(jsonStr, Consts.UTF_8);// 设置content-typeentity.setContentType("application/json");HttpPost httpPost = new HttpPost(url);// 防止被当成攻击添加的httpPost.setHeader("User-Agent", userAgent);// 接收参数设置httpPost.setHeader("Accept", "application/json");httpPost.setEntity(entity);CloseableHttpResponse response = null;try {response = httpclient.execute(httpPost);HttpEntity httpEntity = response.getEntity();result = EntityUtils.toString(httpEntity);} catch (IOException e) {log.error(e.getMessage());} finally {// 关闭CloseableHttpResponseif (response != null) {try {response.close();} catch (IOException e) {log.error(e.getMessage());}}}return result;}/*** 发送不带参数的HttpPost请求*/public static String sendPost(String url) {String result = null;// 得到一个HttpPost对象HttpPost httpPost = new HttpPost(url);// 防止被当成攻击添加的httpPost.setHeader("User-Agent", userAgent);CloseableHttpResponse response = null;try {// 执行HttpPost请求,并得到一个CloseableHttpResponseresponse = httpclient.execute(httpPost);// 从CloseableHttpResponse中拿到HttpEntityHttpEntity entity = response.getEntity();// 将HttpEntity转换为字符串result = EntityUtils.toString(entity);} catch (IOException e) {log.error(e.getMessage());} finally {// 关闭CloseableHttpResponseif (response != null) {try {response.close();} catch (IOException e) {log.error(e.getMessage());}}}return result;}
}

若觉得文章对您有用,不妨 关注 + 收藏 哦!!更多实用文章在首页!

相关文章:

HttpUtils工具类

作为Java开发程序员&#xff0c;需要我们经常写一些工具类来简化开发过程&#xff0c;我们自己肯定写过或者用过HttpUtils用来发送http请求&#xff0c;但是每次手写太繁琐了&#xff0c;于是就按照标准写了一个Http工具类&#xff0c;现在分享出来。 1.HTTP请求简介 HTTP(Hy…...

AI:59-基于深度学习的行人重识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

TCP编程及基础知识

一、端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理&#xff0c;使用端口号来区分TCP端口号与UDP端口号独立端口用两个字节来表示 2byte&#xff08;65535个&#xff09; 众所周知端口&#xff1a;1~1023&#xff08;1~255之间为众所周知端口&#xff…...

二百零一、Flink——Flink配置状态后端运行后报错:Can not create a Path from an empty string

一、目的 在尚硅谷学习用Flink配置状态后端的项目中&#xff0c;运行报错Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from an empty string 二、Flink的状态后端(state backend)类型 &#xff08;一&#xff09;Memo…...

Python 爬虫基础

Python 爬虫基础 1.1 理论 在浏览器通过网页拼接【/robots.txt】来了解可爬取的网页路径范围 例如访问&#xff1a; https://www.csdn.net/robots.txt User-agent: * Disallow: /scripts Disallow: /public Disallow: /css/ Disallow: /images/ Disallow: /content/ Disallo…...

亚马逊云科技大语言模型的创新科技

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;亚马逊云科技大语言模型的创新科技 &#x1f9d9;‍♂️上…...

Qt 各种数据类型

目录 1. 基础类型 2. log 输出 3. 字符串类型 3.2 QByteArray 构造函数 数据操作 子字符串查找和判断 遍历 查看字节数 类型转换 3.3 QString 4. QVariant 4.1 标准类型 4.2 自定义类型 5. 位置和尺寸 5.1 QPoint 5.2 QLine 5.3 QSize 5.4 QRect 6. 日期和…...

电动车展示预约小程序的作用如何

电动车可以说是现在出行常见的方法&#xff0c;覆盖年龄广几乎是每家必备&#xff0c;也有不小大小品牌和经销商&#xff0c;市场需求较高&#xff0c;但在实际经营中&#xff0c;对经销商来时也面临着一些痛点&#xff1a; 1、品牌传播产品展示难 不同品牌竞争很大&#xff…...

「随笔」浅谈2023年云计算的发展趋势

在2023年&#xff0c;云计算的发展趋势将受到政治、经济、社会和科技四个维度的影响。以下是对这些维度的具体分析&#xff1a; 1.1 政治维度&#xff1a; 全球政策推动&#xff1a; 随着全球各国政策对云计算的重视程度不断提高&#xff0c;云计算服务将获得更广泛的市场准入…...

高性能三防工业平板电脑 防摔防爆电容屏工控平板

HT1000是一款高性能工业三防平板&#xff0c;10.1英寸超清大屏&#xff0c;厚度仅14.9mm&#xff0c;超薄机身&#xff0c;可轻松插入袋中&#xff0c;方便携带&#xff0c;搭载8核2.0GHz高性能CPU&#xff0c;行业领先的Android 11.0&#xff0c;设备性能大幅提升&#xff0c;…...

mac flutter pb解析报错:protoc-gen-dart: program not found or is not executable

在mac对pb文件转dart文件的时候报错&#xff1a;protoc-gen-dart: program not found or is not executable 原因是没有安装protoc-gen-dart或者protoc-gen-dart没有设置到环境变量中 解决办法&#xff1a; 1、安装protoc-gen-dart flutter pub global activate protoc_plu…...

PostgreSQL 连接是否要通过SSL,为什么使用SSL 连接后,业务部门会投诉我?

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…...

Linux驱动开发——USB设备驱动

目录 一、 USB 协议简介 二、 Linux USB 驱动 三、 USB 设备驱动实例 一、 USB 协议简介 USB(Universal Serial Bus&#xff0c;通用串行总线)正如它的名字一样&#xff0c;是用来连接PC外设的一种通用串行总线&#xff0c;即插即用和易扩展是它最大的特点。所谓即插即用&am…...

微服务使用指南

微服务使用指南 1.初识微服务 微服务可以认为是一种分布式架构的解决方案&#xff0c;提供服务的独立性和完整性&#xff0c;做到服务的高内聚、低耦合。 目前服务架构主要包含&#xff1a;单体架构和分布式架构。 1.1 单体架构 单体架构&#xff1a;把所有业务功能模块都…...

MYSQL运维篇(已完结)

一、日志 1. 错误日志 2. 二进制日志 &#x1f60e; 介绍 &#x1f60e; 日志格式 &#x1f60e; 日志查看 &#x1f60e; 日志删除 3. 查询日志 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 4. 总结 三、分库分表 1. 介绍 &#x1f364; 问题分析 &#x1f364;…...

MapReduce性能优化之小文件问题和数据倾斜问题解决方案

文章目录 MapReduce性能优化小文件问题生成SequenceFileMapFile案例 &#xff1a;使用SequenceFile实现小文件的存储和计算 数据倾斜问题实际案例 MapReduce性能优化 针对MapReduce的案例我们并没有讲太多&#xff0c;主要是因为在实际工作中真正需要我们去写MapReduce代码的场…...

面向萌新的数学建模入门指南

时间飞逝&#xff0c;我的大一建模生涯也告一段落。感谢建模路上帮助过我的学长和学姐们&#xff0c;滴水之恩当涌泉相报&#xff0c;写下这篇感想&#xff0c;希望可以给学弟学妹们一丝启发&#xff0c;也就完成我的想法了。拙劣的文笔&#xff0c;也不知道写些啥&#xff0c;…...

基于 golang 从零到一实现时间轮算法 (二)

Go实现单机版时间轮 上一章介绍了时间轮的相关概念&#xff0c;接下来我们会使用 golang 标准库的定时器工具 time ticker 结合环状数组的设计思路&#xff0c;实现一个单机版的单级时间轮。 首先我们先运行一下下面的源码&#xff0c;看一下如何使用。 https://github.com/x…...

【系统架构设计】架构核心知识: 5 系统安全性与保密性设计

目录 一 信息安全基础 1 信息安全的基本要素 2 信息安全的范围 3 网络安全...

无人零售奶柜:革新牛奶购买体验

无人零售奶柜&#xff1a;革新牛奶购买体验 无人零售奶柜的投放地点覆盖了社区、写字楼等靠近居民的场所&#xff0c;大大提升了消费者购买牛奶的体验。这一创新不仅令消费者能够享受到与电商平台相媲美的直供价格优势&#xff0c;还让他们能够购买更多、更丰富的知名品牌牛奶。…...

Bunker_mini_dev实战:多雷达(AVIA MID360)ROS1驱动融合与rviz点云同屏可视化

1. 多雷达ROS1驱动融合实战背景 最近在Bunker_mini_dev机器人开发平台上折腾多激光雷达融合&#xff0c;发现不少开发者对Livox AVIA和MID360这两款雷达的ROS1驱动配置存在困惑。我自己踩过不少坑&#xff0c;今天就把从驱动安装到rviz同屏显示的全流程梳理一遍。这种配置在自动…...

如何通过洛雪音乐音源实现高品质音乐自由?

如何通过洛雪音乐音源实现高品质音乐自由&#xff1f; 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 在数字音乐时代&#xff0c;我们常常面临这样的困境&#xff1a;想听的歌曲分散在不同平台&a…...

Qwen2.5-VL视觉定位模型优化升级:GPU加速、批量处理、提示词技巧

Qwen2.5-VL视觉定位模型优化升级&#xff1a;GPU加速、批量处理、提示词技巧 1. 视觉定位技术概述 视觉定位&#xff08;Visual Grounding&#xff09;是计算机视觉领域的一项关键技术&#xff0c;它能够根据自然语言描述在图像中精确定位目标对象。这项技术在智能相册管理、…...

探索开源字体商用解决方案:思源宋体TTF的多场景应用与价值解析

探索开源字体商用解决方案&#xff1a;思源宋体TTF的多场景应用与价值解析 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 副标题&#xff1a;免费商用授权与多场景适配的专业中文字体…...

保姆级教程:在Ubuntu 22.04上搭建PXE服务器,自动化安装麒麟桌面系统(含NFS/TFTP/DHCP配置)

从零构建PXE自动化部署平台&#xff1a;Ubuntu 22.04环境下的麒麟系统无人值守安装实战 在中小型技术团队或开发者个人的工作场景中&#xff0c;频繁部署测试环境往往成为效率瓶颈。传统的光盘或U盘安装方式不仅耗时费力&#xff0c;更难以保证多台设备配置的一致性。本文将带您…...

STM32 HAL库里Systick中断优先级设成0x0F,你的定时器还准吗?

STM32 HAL库中Systick中断优先级设置对定时精度的影响与优化实践 在嵌入式开发领域&#xff0c;定时精度往往直接影响着系统性能与稳定性。许多开发者在使用STM32 HAL库时&#xff0c;可能从未深入思考过Systick中断优先级设置对系统定时精度的影响。本文将揭示一个容易被忽视但…...

# 发散创新:基于事件驱动架构的实时日志监控系统设计与实现在现代分布式系统中,**事件驱动编程模型

发散创新&#xff1a;基于事件驱动架构的实时日志监控系统设计与实现 在现代分布式系统中&#xff0c;事件驱动编程模型正逐渐成为构建高可扩展、高性能应用的核心范式。相比传统的轮询或阻塞式处理方式&#xff0c;事件驱动能够显著降低资源消耗并提升响应效率。本文将深入探讨…...

3步实现专业级字幕去除:面向视频创作者的AI处理工具全指南

3步实现专业级字幕去除&#xff1a;面向视频创作者的AI处理工具全指南 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。AI-based too…...

Transformer搞超分,别再只堆模块了!从TTSR到VSRT,聊聊那些被忽视的局部对齐与轻量化设计

Transformer在超分辨率重建中的创新设计&#xff1a;超越模块堆叠的局部对齐与轻量化实践 当Transformer架构从自然语言处理领域席卷计算机视觉任务时&#xff0c;超分辨率重建(SR)领域也迎来了新一轮的技术革新。然而&#xff0c;许多研究陷入了一个误区——简单地将Transform…...

MOOTDX零代码金融数据解决方案:3个核心价值点解锁股票数据可视化分析

MOOTDX零代码金融数据解决方案&#xff1a;3个核心价值点解锁股票数据可视化分析 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 一、价值定位&#xff1a;为什么MOOTDX是金融数据获取的最优解 打…...