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

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&#xff1a; 1. Http 协议 POST | GET 请求&#xff1b; 2. 支持 报头、报文、参数 自定义配置&#xff1b; 3. GET 返回支持 String | Stream; 4. 相关依赖&#xff1a; <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官网线上刷机的方法。网址&#xff1a;https://flash.android.com/ 本文使用google线上刷机&#xff0c;将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…...

二叉树层序遍历 Leetcode102.二叉树的层序遍历

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

DELTA并联机械手视觉方案荣获2024年度机器人应用典型案例奖

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

Netty 入门学习

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

Magentic-One、AutoGen、LangGraph、CrewAI 或 OpenAI Swarm:哪种多 AI 代理框架最好?

目录 一、说明 二、 AutoGen-自动生成&#xff08;微软&#xff09; 2.1 特征 2.2 局限性 三、 CrewAI 3.1 特征 3.2 限制&#xff1a; 四、LangGraph 4.1 特征&#xff1a; 4.2 限制&#xff1a; 五、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>单击链接前的样式 左键单击&#xff08;且…...

python学opencv|读取图像(三十)使用cv2.getAffineTransform()函数倾斜拉伸图像

【1】引言 前序已经学习了如何平移和旋转缩放图像&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十七&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十八&#xff0…...

Unity3D中基于ILRuntime的组件化开发详解

前言 在Unity3D开发中&#xff0c;组件化开发是一种高效且灵活的软件架构方式。通过将游戏功能拆分为独立的、可重用的组件&#xff0c;开发者可以更容易地管理、扩展和维护代码。而ILRuntime作为一款基于C#的热更新框架&#xff0c;为Unity3D开发者提供了一种高效的热更新和组…...

ELK的搭建

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

国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)

替换介绍&#xff1a; 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统&#xff08;Ubuntu, CentOS&#xff09; 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步&#xff1a; 服务器安装CEOS映像文件&#xff0c;可直接安装&#xff0c;本文采用使用VMware …...

C#里使用libxl读取EXCEL文件里的图片并保存出来

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

【开源免费】基于SpringBoot+Vue.JS企业级工位管理系统(JAVA毕业设计)

本文项目编号 T 127 &#xff0c;文末自助获取源码 \color{red}{T127&#xff0c;文末自助获取源码} T127&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

美国大学的计算机科学专业排名

美国的计算机科学专业在全球范围内享有盛誉&#xff0c;许多大学在该领域具有卓越的教学和研究实力。以下是根据最新的排名和信息整理的美国计算机科学专业顶尖大学列表&#xff1a; 2025年 U.S. News 美国本科计算机科学专业排名&#xff1a; 斯坦福大学&#xff08;Stanfor…...

机器学习实战——决策树:从原理到应用的深度解析

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 决策树&#xff08;Decision Tree&#xff09;是一种简单而直观的分类与回归模型&#xff0c;在机器学习中广泛应用。它的…...

开源生成式物理引擎Genesis,可模拟世界万物

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

kubernetes第七天

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

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...