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

RK3588上CPU和GPU算力以及opencv resize的性能对比测试

RK3588上CPU和GPU算力以及opencv resize的性能对比测试 一.背景二.小结三.相关链接四.操作步骤1.环境搭建A.安装依赖B.设置GPU为高性能模式C.获取GPU信息D.获取CPU信息 2.调用OpenCL SDK获取GPU信息3.使用OpenCL API计算矩阵乘4.使用clpeak测试GPU的性能5.使用OpenBLAS测试CPU的…...

基于Centos 7系统的安全加固方案

创作不易&#xff0c;麻烦点个免费的赞和关注吧&#xff01; 声明&#xff01; 免责声明&#xff1a;本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害&#xff0c;包括但不限于数据丢失、系统损坏、个人隐私泄露或经济损失等&#xf…...

IT行业的发展趋势

一、引言 IT&#xff08;信息技术&#xff09;行业自诞生以来&#xff0c;就以惊人的速度发展&#xff0c;不断改变着我们的生活、工作和社会结构。如今&#xff0c;随着技术的持续创新、市场需求的演变以及全球经济格局的变化&#xff0c;IT行业正迈向新的发展阶段&#xff0…...

《探秘开源多模态神经网络模型:AI 新时代的万能钥匙》

《探秘开源多模态神经网络模型&#xff1a;AI 新时代的万能钥匙》 一、多模态模型的崛起之路&#xff08;一&#xff09;从单一到多元&#xff1a;模态的融合演进&#xff08;二&#xff09;关键技术突破&#xff1a;解锁多模态潜能 二、开源多模态模型深度剖析&#xff08;一&…...

ROS核心概念解析:从Node到Master,再到roslaunch的全面指南

Node 在ROS中&#xff0c;最小的进程单元就是节点&#xff08;node&#xff09;。一个软件包里可以有多个可执行文件&#xff0c;可执行文件在运行之后就成了一个进程(process)&#xff0c;这个进程在ROS中就叫做节点。 从程序角度来说&#xff0c;node就是一个可执行文件&…...

2025广州国际汽车内外饰技术展览会:引领汽车内外饰发展新潮流-Automotive Interiors

随着科技的不断进步和消费者对汽车品质的要求日益提高&#xff0c;汽车内外饰的设计和制造也在不断创新和发展。AUTO TECH China 2025广州国际汽车内外饰技术展览会作为行业内的重要盛会&#xff0c;将于2025年11月20日至22日在广州保利世贸博览馆盛大举办。本次展览会将汇集全…...

ElasticSearch内存占用率过高怎么办?

文章目录 1&#xff0c;先用top看看各个进程的内存占用情况2&#xff0c;不能简单的杀死进程&#xff0c;然后再重启。3&#xff0c;查看一下ElasticSearch进程的具体启动情况4&#xff0c;修改Elasticsearch 的Java堆内存 1&#xff0c;先用top看看各个进程的内存占用情况 先…...

基于Qt的OFD阅读器开发原理与实践

摘要 本文详细探讨了基于Qt开发OFD阅读器的原理与实践。通过解析OFD文件格式、构建文档结构、实现页面渲染、处理用户交互以及进行性能优化&#xff0c;本文展示了如何使用Qt框架开发一个功能强大、性能优异的OFD阅读器。文章还提供了示例代码和未来发展方向&#xff0c;为开发…...

用 HTML5 Canvas 和 JavaScript 实现流星雨特效

最近在研究前端动画效果时,实现了一个超酷的流星雨特效,今天来和大家分享下具体实现过程。 1,整体实现思路 这个流星雨特效主要由 HTML、CSS 和 JavaScript 协同完成。HTML 搭建基础结构,CSS 负责页面样式设计,JavaScript 实现星星和流星的动态效果。 效果展示: 用 HTM…...

Apifox=Postman+Swagger+Jmeter+Mock

A. 开发人员接口管理使用(Swagger 工具管理接口) B. 后端开发人员通过Postman 工具&#xff0c;一边开发一边测试 C. 前端开发人员需要Mock 工具提供前端调用 D. 测试人员通过(Postman、Jmeter)等工具进行接口测试 为了后台开发、前端开发、测试工程师等不同角色更加便捷管理…...

网站建设学什么/百度一下浏览器下载安装

SpringBoot使用缓存注解 文章目录 SpringBoot使用缓存注解缓存注解入门三个步骤一、入门体验缓存注解1. 创建SpringBoot项目&#xff0c;仅导入web和cache的依赖2. 在启动类上加上EnableCaching注解3.在方法上使用缓存注解演示效果&#xff0c;多次访问该方法二、整合mysql环境…...

网站制作首选 新鸿儒/上热门最火标题

前言&#xff1a;分类是机器学习中的重要的一种功能&#xff0c;在机器学习的研究历史中&#xff0c;诞生了大量的分类算法&#xff0c;而每种算法都有其优势和不足。 本文汇总了常用的分类算法及其实现方式&#xff0c;方便快速查询使用。&#xff08;本文使用鸢尾花数据集&am…...

做防水广告在哪个网站最好/夸克搜索网页版

第一步:对制品2D图及3D图的分析和消化&#xff0c;其内容包括以下几个方面&#xff1a; 1、制品的几何形状。 2、制品的尺寸、公差及设计基准。 3、制品的技术要求&#xff08;即技术条件&#xff09;。 4、制品所用塑料名称、缩水及颜色。 5、制品的表面要求。 第二步&am…...

广州企业注册一网通/seo优化工具大全

Java分布式锁 原文出自&#xff1a;https://blog.csdn.net/seesun2012 ### 什么是锁&#xff1f; 在单进程的系统中&#xff0c;当存在多个线程可以同时改变某个变量&#xff08;可变共享变量&#xff09;时&#xff0c;就需要对变量或代码块做同步&#xff0c;使其在修改这…...

动画设计就业前景/seo快速排名源码

http://www.docin.com/p-443803801.html...

优质的天津网站建设/任何小说都能搜到的软件

1.问题&#xff1a;插件安装&#xff0c;但启动不了 2.解决方案&#xff1a; 1&#xff09;去obsidian插件官网搜索 2&#xff09;下载以下3个文件&#xff0c;到 .obsidian/plugin目录下 路径&#xff1a;F:\2023年.obsidian\plugins\cMenu 1.1.1 3&#xff09;进入obsidian&…...