Java - Http 通讯
Java - Http 通讯
PS:
1. Http 协议 POST | GET 请求;
2. 支持 报头、报文、参数 自定义配置;
3. GET 返回支持 String | Stream;
4. 相关依赖:
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.4.1</version>
</dependency><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version>
</dependency>
Demo1: GET
/**
* Get 请求,仅带参数
*/
RequestHelper.create(IP + URL_TOKEN).params("from_account", ACCOUNT_ID).params("app_key", APP_KEY).params("app_secret", APP_SECRET).getStr(new RequestHelper.NetListener() {@Overridepublic void onSuccess(String jsonStr) {//CommonUtil.printLog(jsonStr);JSONObject jsonObject = JSON.parseObject(jsonStr);int state = jsonObject.getIntValue("errcode");if (state == 0) {U8Token token = jsonObject.getObject("token", U8Token.class);long updateTime = System.currentTimeMillis();CommonUtil.printLog(token.toString());} else {CommonUtil.printLog(jsonStr);}}@Overridepublic void onError(Throwable e) {CommonUtil.printLog(e.getMessage());}});
Demo 2: POST
/**
* POST 请求:
* 带 报头、报文;
* 参数放在 报文 内;
*/
baseConnect(url, 1, 1, new RequestHelper.NetListener() {@Overridepublic void onSuccess(String jsonStr) {JSONObject jsonObject = JSON.parseObject(jsonStr);JSONObject data = jsonObject.getJSONObject("std_data");if (data == null) {CommonUtil.printLog("success: " + jsonStr);return;}JSONObject state = data.getJSONObject("execution");String code = state.getString("code");if (code.equals("0")) {JSONObject parameter = data.getJSONObject("parameter");int count = parameter.getIntValue("cnt");} else {CommonUtil.printLog("error: " + jsonStr);}}@Overridepublic void onError(Throwable e) {CommonUtil.printLog(e.getMessage());}
});private static void baseConnect(String urlName, int no, int size, RequestHelper.NetListener listener) {JSONObject hostObj = new JSONObject();hostObj.put("ver", Config.ERP_CONST.HOST_VER);hostObj.put("prod", Config.ERP_CONST.HOST_PROD);hostObj.put("timezone", "+8");hostObj.put("ip", Config.ERP_CONST.SER_IP);hostObj.put("id", "");hostObj.put("lang", "zh_CN");hostObj.put("acct", Config.ERP_CONST.HOST_ACCT);hostObj.put("timestamp", getTimeStamp());JSONObject serviceObj = new JSONObject();serviceObj.put("prod", Config.ERP_CONST.SER_PROD);serviceObj.put("ip", Config.ERP_CONST.SER_IP);serviceObj.put("name", urlName);serviceObj.put("id", Config.ERP_CONST.SER_ID);JSONObject paramObj = new JSONObject();JSONObject pObj = new JSONObject();pObj.put("pageSize", size);pObj.put("pageNo", no);pObj.put("isGetSchema", false);pObj.put("isGetCount", true);pObj.put("conditions", new ArrayList<String>());pObj.put("orders", new ArrayList<String>());paramObj.put("parameter", pObj);String key = MD5Encode(hostObj.toJSONString() + serviceObj.toJSONString());RequestHelper.create(Config.ERP_CONST.IP).header("digi-key", key).header("digi-host", hostObj.toJSONString()).header("digi-service", serviceObj.toJSONString()).header("digi-data-exchange-protocol", "1.0").header("Content-Type", "application/json").header("digi-type", "sync").body("std_data", paramObj).postStr(listener);
}
RequestHelper.java
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
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.methods.HttpRequestBase;
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.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;/*** @author Virgo* @version 1.0* @date 2024/12/18 15:42* @usage http post | get 连接请求*/
public class RequestHelper {private final Map<String, Object> mapParam;//paramer 参数private Map<String, Object> mapBody;//post -> body 报文private Map<String, Object> mapHeader;//head 报头private final String url;private static PoolingHttpClientConnectionManager manager;//共用连接池private RequestHelper(String url) {this.url = url;mapParam = new HashMap<>();init();}private void init() {if (manager == null) {manager = new PoolingHttpClientConnectionManager();manager.setMaxTotal(10);// 整个连接池最大连接数manager.setDefaultMaxPerRoute(5);// 每路由最大连接数,默认值是2}}public static RequestHelper create(String url) {return new RequestHelper(url);}public RequestHelper header(String key, Object value) {if (mapHeader == null) {mapHeader = new HashMap<>();}mapHeader.put(key, value);return this;}public RequestHelper header(Map<String, Object> map) {if (map == null) {return this;}if (mapHeader == null) {mapHeader = new HashMap<>();}mapHeader.putAll(map);return this;}public RequestHelper body(String key, Object value) {if (mapBody == null) {mapBody = new HashMap<>();}mapBody.put(key, value);return this;}public RequestHelper body(Map<String, Object> map) {if (map == null) {return this;}if (mapBody == null) {mapBody = new HashMap<>();}mapBody.putAll(map);return this;}public RequestHelper params(Map<String, Object> map) {if (map == null) {return this;}mapParam.putAll(map);return this;}public RequestHelper params(String key, Object value) {mapParam.put(key, value);return this;}/*** post 请求** @param listener 回调*/public void postStr(final NetListener listener) {
// HttpPost post = new HttpPost(parseParam(url));HttpPost post;try {post = new HttpPost(parseParam2(url));
// CommonUtil.printLog("url: " + post.getURI().toString());} catch (URISyntaxException e) {if (listener != null) {listener.onError(e);}return;}//headerif (mapHeader != null && mapHeader.size() > 0) {for (Map.Entry<String, Object> next : mapHeader.entrySet()) {post.addHeader(next.getKey(), String.valueOf(next.getValue()));
// CommonUtil.printLog(next.getKey()+ ":" + next.getValue());}}//bodyif (mapBody != null && mapBody.size() > 0) {JSONObject obj = new JSONObject(mapBody);
// JSONObject obj = (JSONObject) JSONObject.toJSON(mapBody.get("data"));String body = JSONObject.toJSONString(obj, SerializerFeature.WriteMapNullValue);//保留空值StringEntity entity;try {entity = new StringEntity(body);post.setEntity(entity);} catch (UnsupportedEncodingException e) {if (listener != null) {listener.onError(e);}return;}
// CommonUtil.printLog("body: " + body);}getResult(post, listener);}/*** get 请求** @param listener 回调 string*/public void getStr(final NetListener listener) {HttpGet get;try {get = new HttpGet(parseParam2(url));} catch (URISyntaxException e) {if (listener != null) {listener.onError(e);}return;}//headerif (mapHeader != null && mapHeader.size() > 0) {for (Map.Entry<String, Object> next : mapHeader.entrySet()) {get.addHeader(next.getKey(), String.valueOf(next.getValue()));}}getResult(get, listener);}/*** get 请求** @param listener 回调 stream*/public void getStream(NetFileListener listener) {HttpGet get;try {get = new HttpGet(parseParam2(url));} catch (URISyntaxException e) {if (listener != null) {listener.onError(e);}return;}if (mapHeader != null && mapHeader.size() > 0) {for (Map.Entry<String, Object> next : mapHeader.entrySet()) {get.addHeader(next.getKey(), String.valueOf(next.getValue()));}}getResultStream(get, listener);}/*** 自定义 请求转换参数** @param url url* @return 转换后url*/private String parseParam(String url) {//参数if (mapParam.size() > 0) {StringBuilder builder = new StringBuilder(url);boolean isFirst;isFirst = !url.contains("?");for (Map.Entry<String, Object> next : mapParam.entrySet()) {if (isFirst) {builder.append("?");} else {builder.append("&");}isFirst = false;builder.append(next.getKey()).append("=").append(next.getValue());}return builder.toString();} else {return url;}}/*** 请求转换参数** @param url url* @return URI* @throws URISyntaxException e*/private URI parseParam2(String url) throws URISyntaxException {URIBuilder ub = new URIBuilder();ub.setPath(url);//参数if (mapParam.size() > 0) {ArrayList<NameValuePair> pairs = covertParams2NVPS(mapParam);ub.setParameters(pairs);}return ub.build();}//格式化参数private ArrayList<NameValuePair> covertParams2NVPS(Map<String, Object> params) {ArrayList<NameValuePair> pairs = new ArrayList<>();for (Map.Entry<String, Object> param : params.entrySet()) {pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(param.getValue())));}return pairs;}/*** 处理Http请求*/private void getResult(HttpRequestBase request, NetListener listener) {CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(manager).build();try {CloseableHttpResponse response = httpClient.execute(request);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity);response.close();if (listener != null) {listener.onSuccess(result);}}} catch (IOException e) {if (listener != null) {listener.onError(e);}}}private void getResultStream(HttpRequestBase request, NetFileListener listener) {CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(manager).build();try {CloseableHttpResponse response = httpClient.execute(request);HttpEntity entity = response.getEntity();if (entity != null) {long len = entity.getContentLength();// -1 表示长度未知if (listener != null) {listener.onProgress(len, 0, 0);listener.onSuccess(entity.getContent());}response.close();}} catch (IOException e) {if (listener != null) {listener.onError(e);}}}public interface NetListener {void onSuccess(String jsonStr);void onError(Throwable e);}public interface NetFileListener {void onSuccess(InputStream stream);void onError(Throwable e);void onProgress(long totalSize, long currentSize, long speed);}
}
相关文章:

Java - Http 通讯
Java - Http 通讯 PS: 1. Http 协议 POST | GET 请求; 2. 支持 报头、报文、参数 自定义配置; 3. GET 返回支持 String | Stream; 4. 相关依赖: <dependency><groupId>org.apache.httpcomponents</groupId><…...

C++ Qt练习项目 QChar功能测试
个人学习笔记 代码仓库 GitCode - 全球开发者的开源社区,开源代码托管平台 新建项目 设计UI 1、拖入group box去掉名字 2、拖入2个LineEdit 3、拖入两个Label 4、拖入两个PushButton 5、点栅格布局 1、拖入GroupBox 2、拖入4个PushButton 3、点栅格布局 1、拖入GroupBo…...

android 官网刷机和线刷
nexus、pixel可使用google官网线上刷机的方法。网址:https://flash.android.com/ 本文使用google线上刷机,将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…...

二叉树层序遍历 Leetcode102.二叉树的层序遍历
二叉树的层序遍历相当于图论的广度优先搜索,用队列来实现 (二叉树的递归遍历相当于图论的深度优先搜索) 102.二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右…...

DELTA并联机械手视觉方案荣获2024年度机器人应用典型案例奖
直击现场 2025年1月9日晚,2024深圳市机器人年度评选颁奖典礼在深圳市南山区圣淘沙酒店正式拉开帷幕。本次颁奖活动由中国科学院深圳先进技术研究院指导,深圳市机器人协会与《机器人与智能系统》杂志组织承办。 正运动公司受邀参与此次典礼,…...

Netty 入门学习
前言 学习Spark源码绕不开通信,Spark通信是基于Netty实现的,所以先简单学习总结一下Netty。 Spark 通信历史 最开始: Akka Spark 1.3: 开始引入Netty,为了解决大块数据(如Shuffle)的传输问题 Spark 1.6&…...

Magentic-One、AutoGen、LangGraph、CrewAI 或 OpenAI Swarm:哪种多 AI 代理框架最好?
目录 一、说明 二、 AutoGen-自动生成(微软) 2.1 特征 2.2 局限性 三、 CrewAI 3.1 特征 3.2 限制: 四、LangGraph 4.1 特征: 4.2 限制: 五、OpenAI Swarm 5.1 特征 5.2 限制 六、Magentic-One 6.1 特征 6.2 限制 七、…...
openstack下如何生成centos9 centos10 和Ubuntu24 镜像
如何生成一个centos 10和centos 9 的镜像1. 下载 对应的版本 wget https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-x86_64-10-latest.x86_64.qcow2 wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-Gener…...
Kivy App开发之UX控件Slider滑块
在app中可能会调节如音量,亮度等,可以使用Slider来实现,该控件调用方便,兼容性好,滑动平稳。在一些参数设置中,也可以用来调整数值。 支持水平和垂直方向,可以设置默认值,最小及最大值。 使用方法,需用引入Slider类,通过Slider类生成一个滑块并设置相关的样式后,再…...

CSS——22.静态伪类(伪类是选择不同元素状态)
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>静态伪类</title> </head><body><a href"#">我爱学习</a></body> </html>单击链接前的样式 左键单击(且…...

python学opencv|读取图像(三十)使用cv2.getAffineTransform()函数倾斜拉伸图像
【1】引言 前序已经学习了如何平移和旋转缩放图像,相关文章链接为: python学opencv|读取图像(二十七)使用cv2.warpAffine()函数平移图像-CSDN博客 python学opencv|读取图像(二十八࿰…...
Unity3D中基于ILRuntime的组件化开发详解
前言 在Unity3D开发中,组件化开发是一种高效且灵活的软件架构方式。通过将游戏功能拆分为独立的、可重用的组件,开发者可以更容易地管理、扩展和维护代码。而ILRuntime作为一款基于C#的热更新框架,为Unity3D开发者提供了一种高效的热更新和组…...

ELK的搭建
ELK elk:elasticsearch logstatsh kibana统一日志收集系统 elasticsearch:分布式的全文索引引擎点非关系型数据库,存储所有的日志信息,主和从,最少需要2台 logstatsh:动态的从各种指定的数据源,获取数据…...

国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)
替换介绍: 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统(Ubuntu, CentOS) 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步: 服务器安装CEOS映像文件,可直接安装,本文采用使用VMware …...

C#里使用libxl读取EXCEL文件里的图片并保存出来
有时候需要读取EXCEL里的图片文件, 因为很多用户喜欢使用图片保存在EXCEL里,比如用户保存一些现场整改的图片。 如果需要把这些图片抽取出来,再保存到系统里,就需要读取这些图片数据,生成合适的文件再保存。 在libxl里也提供了这样的方法, 如下: var picType = boo…...

【开源免费】基于SpringBoot+Vue.JS企业级工位管理系统(JAVA毕业设计)
本文项目编号 T 127 ,文末自助获取源码 \color{red}{T127,文末自助获取源码} T127,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
美国大学的计算机科学专业排名
美国的计算机科学专业在全球范围内享有盛誉,许多大学在该领域具有卓越的教学和研究实力。以下是根据最新的排名和信息整理的美国计算机科学专业顶尖大学列表: 2025年 U.S. News 美国本科计算机科学专业排名: 斯坦福大学(Stanfor…...

机器学习实战——决策树:从原理到应用的深度解析
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 决策树(Decision Tree)是一种简单而直观的分类与回归模型,在机器学习中广泛应用。它的…...

开源生成式物理引擎Genesis,可模拟世界万物
这是生成大模型时代 —— 它们能生成文本、图像、音频、视频、3D 对象…… 而如果将所有这些组合到一起,我们可能会得到一个世界! 现在,不管是 LeCun 正在探索的世界模型,还是李飞飞想要攻克的空间智能,又或是其他研究…...

kubernetes第七天
1.影响pod调度的因素 nodeName 节点名 resources 资源限制 hostNetwork 宿主机网络 污点 污点容忍 Pod亲和性 Pod反亲和性 节点亲和性 2.污点 通常是作用于worker节点上,其可以影响pod的调度 语法:key[value]:effect effect:[ɪˈfek…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...