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…...
小红书内容保存难题,这款Python工具如何实现一键无水印下载?
小红书内容保存难题,这款Python工具如何实现一键无水印下载? 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作…...
电子元器件失效分析与预防实战指南
1. 电子元器件失效的底层逻辑剖析 电子元器件失效的本质是材料特性、环境应力与时间因素共同作用的结果。作为一名硬件工程师,我处理过数百例元器件失效案例,发现失效模式往往遵循"应力-损伤-失效"的因果链。理解这个链条,才能从根…...
AGV如何实现自主避障
下面按“传感器→建模→算法→安全机制→工程实现”的顺序,把AGV自主避障讲清楚。 一、整体架构概览 AGV要“自己绕开障碍”,至少要做三件事: 1)感知:知道“我在哪”“周围有什么”; 2)规划&…...
成本控制艺术:OpenClaw+Phi-3-vision-128k-instruct任务级计费方案
成本控制艺术:OpenClawPhi-3-vision-128k-instruct任务级计费方案 1. 当Token消耗成为拦路虎 上个月收到账单时,我的手指在鼠标滚轮上停滞了整整三秒——Phi-3-vision-128k-instruct的API调用费用比预期高出47%。这个数字让我意识到,在享受…...
踩下油门的那一刻,P2并联混动系统开始了一场精密的能量博弈。咱们今天不聊枯燥的理论,直接钻进Simulink模型里看看这套系统怎么玩转发动机和电机的“二人转
基于Matlab/simulink的P2并联PHEV插电式混合动力汽车建模控制仿真模型(同轴、双轴并联插电混合动力汽车仿真模型) ——包括整车HCU控制单元、发动机模型、驱动电机模型、AMT5档自动变速箱模型、驾驶员模型、电池能量管理控制模型等,建模详细清…...
收藏备用!AI大模型自学路线(小白/程序员专属),从入门到实战少走90%弯路
当下AI大模型已成技术领域的核心热点,无论是零基础小白,还是想转型进阶的程序员,都纷纷投身其中。但自学过程中,多数人都会陷入“找不到方向、学了不会用、越学越迷茫”的困境。今天就为大家整理一份系统、可落地、无冗余的AI大模…...
中文NLP入门首选:bert-base-chinese预训练模型快速部署指南
中文NLP入门首选:bert-base-chinese预训练模型快速部署指南 1. 为什么选择bert-base-chinese模型 如果你刚开始接触中文自然语言处理,bert-base-chinese绝对是最佳起点。这个由Google发布的预训练模型,已经成为中文NLP领域的"瑞士军刀…...
三维建模师必看:Blender中坐标变换的数学原理与操作技巧
三维建模师必看:Blender中坐标变换的数学原理与操作技巧 在Blender的世界里,每个顶点、每条边、每个面都在三维空间中占据着精确的位置。当我们移动一个物体、缩放一个模型或旋转一个摄像机时,背后是一套精密的数学机制在运作。对于艺术背景的…...
别再让AI瞎猜了!手把手教你为项目创建AGENTS.md文件(附Turbo monorepo实战模板)
别再让AI瞎猜了!手把手教你为项目创建AGENTS.md文件(附Turbo monorepo实战模板) "AI生成的代码又跑偏了!"——这可能是现代开发者最常遇到的挫败场景之一。当你在Turborepo管理的monorepo中工作时,AI助手可…...
我在 Mac 写了个服务,硬要它在 18 岁高龄的 Windows 服务器上跑,结果…
前言 事情是这样的。 我有个朋友(以下称他为"怨种朋友"),找到我说: "帮我写个 Go 服务,在你自己 Mac 上开发,最后要能跑在咱们公司那台快入土的 Windows 2008 服务器上。" 我当时的…...
