用蹩脚英语在StackOverflow上飞奔:试看以色列兄弟自荐的Http文件上传工具MgntUtils

news/2024/11/9 5:04:55/

上班摸鱼、下班干活,日常埋坑、加班填坑——这是我的搬砖,亦是在座的各位!

文章目录

    • 1.试看MgntUtils来源
    • 2.下载MgntUtils源码
    • 3.初探源码
    • 4.验证API

1.试看MgntUtils来源

 ​ ​上篇文章说到,有个以色列大兄弟在回答Stack Overflow上一个问题——如何在Rest-Post接口中发送文件上传请求上推荐了一个自己编写维护的工具MgntUtils来实现 (查看上文),在下本着事事必当刨根问底、物物应当追根溯源的人生信条,翻遍github、终于上找到了他所说的这个源码地址 Mgnt。一看他的发布和维护记录,居然有着近7年的革命历程,Fork和Star数量虽然不多,但他这种持之以恒、坚持不懈的更新精神实属让我敬佩(虽然大多是一年更新一两次)。
在这里插入图片描述
点开他的github主页,哦哟,这头像不会就是他本人吧,成熟稳重、戴着一副小眼镜儿、一看就很有开发经验的牙子,主要开发语言也是JAVA。
在这里插入图片描述
走偏了走偏了,我们还是来回来看看他说的这个代码吧!

2.下载MgntUtils源码

  打开IDEA,复制github下载地址,一发Clone下载下来。

在这里插入图片描述
目录结构大概如下,其中主要是封装了几个常见工具类的使用File、String、JSON、Text、Time、Web等,而今天我们主要关注的是那个他所说的可以直接上传文件的工具类HttpClient。
在这里插入图片描述

3.初探源码

  找到源码中的HttpClient类,其中除了基本的设置一些请求参数外,对外调用主要是两种方法sendHttpRequestsendHttpRequestForBinaryResponse,区别在于返回的数据类型。
在这里插入图片描述
点进入sendHttpRequest方法内部我们可知,原来他使用的是JAVA原生的HttpURLConnection来实现http接口请求的哇,果然还是印证了那句至理名言——最初的才是最好的!
在这里插入图片描述
不慌,那么我们再稍微看看这个sendRequest方法内部干了啥。

  1. 打开一个httpURLConnection连接。
  2. 获取一个输出流DataOutputStream。
  3. 把请求参数写入。
    在这里插入图片描述

完了,方法就这么几行,都是些熟悉的不能再熟悉的api了,思绪一下把我拉回到了几年前刚学java的时候了。咦咦咦!这也没看到有啥文件上传代码的样子呀?我可是记得采用HttpURLConnection实现上传文件不是还有什么BOUNDARY、换行写入、Content-Disposition、文件流,兄弟们有没有印象?
好吧,宽宏大量如我,暂且先放过这个可能是在吹牛皮的大兄弟吧,那我们就去验证一下他写的这个HttpClient对于普通的http请求是否能行?
在这里插入图片描述

4.验证API

  首先我们创建一个SpringBoot工程,提供三个接口(Get/Post/FileUpload),并通过Postman请求调用一下,确认木有问题。

@RequestMapping(value = "/mgnt/api/v1")
@RestController
public class TestMgntController {/*** @Description : 测试带参数Get请求* @auther: xren* @date: 2023/5/20 12:30*/@RequestMapping(value = "/testGet")public Object testGet(@RequestParam("name") String name){Map<String,Object> data=new HashMap<>();data.put("id", UUID.randomUUID().toString()) ;data.put("name", name+"-"+ new Date().toLocaleString()) ;data.put("method","testGet") ;return data;}/*** @Description : 测试Post* @auther: xren* @date: 2023/5/20 12:49*/@RequestMapping(value = "/testPost")public Object testPost(@RequestBody Map<String,Object> params){params.put("id", UUID.randomUUID().toString()) ;params.put("time",new Date().toLocaleString()) ;params.put("method","testPost") ;return params;}/*** @Description : 测试文件上传* @auther: xren* @date: 2023/5/20 12:30*/@PostMapping("/testUpload")public Object upload(@RequestParam("file") MultipartFile file, @RequestParam("fileName") String name) throws Exception {// 设置上传至项目文件夹下的uploadFile文件夹中,没有文件夹则创建File dir = new File("uploadFile");if (!dir.exists()) {dir.mkdirs();}File dstFile=new File(dir.getAbsolutePath() + File.separator + name );file.transferTo(dstFile);Map<String,Object> data=new HashMap<>();data.put("id", UUID.randomUUID().toString()) ;data.put("filePath", dstFile.getAbsolutePath()) ;data.put("method","testUpload") ;return data;}
}

其次再另外创建一个普通maven工程,引入MgntUtils和junit方便测试。

<dependency><groupId>com.github.michaelgantman</groupId><artifactId>MgntUtils</artifactId><version>1.6.0.6</version>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>

创建一个单元测试用例,验证Get请求,如下是可以获取到响应的。
在这里插入图片描述
再来创建一个单元测试用例,验证Post请求,如下看也是可以获取到响应的。注意方法的请求参数必须要转换成ByteBuffer类型。
在这里插入图片描述
最后再来创建一个单元测试用例,验证FileUpload请求吧,让我们来找一找…找一找一…找…
半个小时后…
没找到可以直接调用的Api呀!你这大兄弟诚不欺我!!!!
在这里插入图片描述

总结:以色列大兄弟推荐的这款他自己开发维护的MgntUtils工具类经测试是可以进行普通的Http-Get/Post接口调用的,但要实现文件上传可就还差那么点意思咯!其中的HttpClient类内部是采用HttpURLConnection进行接口调用、没有请求复用链接优化等相关策略、比较原生,建议大家学习参考即可。(其实它主打的是另外几个工具类JSONUtils、FileUtils、WebUtils等)


http://www.ppmy.cn/news/73904.html

相关文章

离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)

本文主要解决以下几个问题&#xff1a; 1.欧拉图能不能有割点&#xff0c;能不能有桥&#xff1f; 2.哈密顿图能不能有割点&#xff0c;能不能有桥&#xff1f; 首先我们要明白几个定义 割点的定义就是在一个图G中&#xff0c;它本来是连通的&#xff0c;去掉一个点v以后这个…

计算卸载-论文05-双层优化(无线充电与卸载)

标题&#xff1a;《A Divide-and-Conquer Bilevel Optimization Algorithm for Jointly Pricing Computing Resources and Energy in Wireless Powered MEC》 期刊&#xff1a;IEEE TRANSACTIONS ON CYBERNETICS&#xff0c;2022 一、理论梳理 问题&#xff1a;相比于移动云…

Shader Graph18-反射、折射函数

一、打开Unreal&#xff0c;新建Material叫做DemoReflectionRefraction 首先是看一下引擎内置的反射&#xff0c;Base Color设置为1是白色&#xff0c;Metallic设置为1金属强度为最大&#xff0c;Roughness为0粗糙度为最小&#xff0c;那么最后的结果球面上显示的就是周围环境。…

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问)

《汇编语言》- 读书笔记 - 第3章-寄存器&#xff08;内存访问&#xff09; 3.1 内存中字的存储问题 3.1 3.2 DS 和 [address]问题 3.2 3.3 字的传送问题 3.3问题 3.4 3.4 mov、add、sub 指令3.5 数据段问题 3.53.1~3.5 小结检测点 3.1 3.6 栈3.7 CPU 提供的栈机制问题 3.6 3.8 …

ASEMI代理Infineon英飞凌IPB072N15N3G原厂MOS管

编辑-Z IPB072N15N3G参数描述&#xff1a; 型号&#xff1a;IPB072N15N3G 持续漏极电流&#xff1a;100A 脉冲漏极电流&#xff1a;400A 雪崩能量&#xff0c;单脉冲&#xff1a;780 mJ 栅极-源极电压&#xff1a;20V 功率耗散&#xff1a;300W 操作和储存温度&#xf…

Python实现ACO蚁群优化算法优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

springboot项目网站部署到服务器

用eclipse跟着教程做了一个网站&#xff0c;java语言&#xff0c;springboot项目。在本地电脑上运行成功后&#xff0c;想把它部署到线上&#xff0c;通过网络访问。下面是我自己作为新手自己摸索出来的一个方法&#xff0c;供读者参考。 目录 1. jar包 2. 服务器 3. jdk 和 T…

Python系列模块之标准库OS详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 ​一、模块 1.1 模块的定义 1.2 模块的分类 1.3 模块的基本导入语法 二、Python中的包 三、标准库之os模块 实战&#xff1a; 钉钉告警应用 一、模块 1.1 模块的定义 Python 模块(Module)&a…