当前位置: 首页 > 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…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...