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

news2024/11/19 22:41:02

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

文章目录

    • 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.coloradmin.cn/o/553944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13岁青少年DAO创始人:Web3治好了我的“丧”

“我看大家都死气沉沉的&#xff0c;大家都站起来活动活动。” 4月&#xff0c;香港Web3嘉年华的一场沙龙&#xff0c;橙色针织帽给黑压压的现场带来一抹亮色&#xff0c;13岁的Carry Zheng戴着它登台&#xff0c;没有“大家好”的寒暄&#xff0c;直接向台下的成年人发出指令&…

训练营-5月

JAVA训练营-5月 一、环境 1、idea安装 idea就是一个开发工具&#xff0c;写代码的地方 目录结构&#xff1a; --- 项目&#xff08;工程 project&#xff09; 比如&#xff1a;京东 ---- 模块&#xff08;module&#xff09; 比如&#xff1a;订单、购物车、秒杀等 -----…

ALOHA 开源机械臂(Viper 300 Widow X 250 6DOF机械臂 远程操控系统)第四部分

Teleoperation System 远程操作系统 We introduce ALOHA: A Low-cost Open-source Hardware System for Bimanual Teleoperation. With a $20k budget, it is capable of teleoperating precise tasks such as threading a zip tie, dynamic tasks such as juggling a ping p…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→端到端案例

1 样例调试 1.1 日志文件 运行应用程序后&#xff0c;若出现报错或异常&#xff0c;需录取日志进一步定位问题。日志文件的默认目录为$HOME/ascend/log。 可通过环境变量指定日志文件的落盘路径 export ASCEND_PROCESS_LOG_PATH/$HOME/xxx但需要确保该目录为任意有读写权限…

外参手算方法

虽然有的slam系统是代外参标定功能&#xff0c;可以在线标定&#xff08;vins&#xff09;或者离线进行标定&#xff0c;但外参标定的质量也会与运动激励相关的&#xff0c;例如对于3自由度的小车很难把z方向的外参标定的很好。有些情况车子或者是定位模块是有设计图纸的&#…

Ubuntu22.04下使用Conda安装PyTorch GPU版本

环境 首先&#xff0c;你需要有 GPU 支持。 Ubuntu 22.04 显卡 $ nvidia-smi Mon May 22 11:15:33 2023 --------------------------------------------------------------------------------------- | NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA…

MySQL在Centos7环境下的安装操作

文章目录 一、卸载不需要的环境二、通过yum安装MySQL1.安装MySQL的yum源2.安装MySQL 三、启动mysql的服务器四、登录MySQL1.方法一2.方法二3.方法三 五、配置my.cnf文件 一、卸载不需要的环境 首先要检查服务器中是否存在mariadb&#xff0c;mariadb是MySQL的一个开源分支&…

栈与C++中的std::stack详解(多图超详细)

文章目录 栈(stack)什么是栈&#xff1f;栈的基本操作和应用入栈&#xff08;push)出栈&#xff08;pop)入栈和出栈的复杂度和应用场景 类模板std::satck形参T和Container成员函数元素访问栈的容量栈的修改 用法示例 栈(stack) 什么是栈&#xff1f; 栈是一种线性的数据结构&…

Python爬虫被封ip解决方案

在使用 Python 程序进行网络爬虫开发时&#xff0c;可能因以下原因导致被封 IP 或封禁爬虫程序&#xff1a; 1、频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次&#xff0c;从而对目标网站造成较大的负担和压力&#xff0c;这种行为容易引起目标网站的注意并被封禁…

2023ACP世界大赛中国总决赛|让世界再多一个微笑

5月21日&#xff0c;正值第三十三次全国助残日&#xff0c;作为公益推行的一份子&#xff0c;恒利联创也呈现出了“仁者爱人”的文化内核。 恒利联创携手微笑明天慈善基金会合作同行&#xff0c;旨在推动公益&#xff0c;促进残疾人事业的全面发展。在前行的道路上&#xff0c…

MQTT入门手册

初识MQTT MQTT 协议简介 概览 MQTT 是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专门针对低带宽和不稳定网络环境的物联网应用而设计&#xff0c;可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于物联网、移动互联网、智能硬件、车联网…

​LeetCode解法汇总1080. 根到叶路径上的不足节点

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 …

Mybatis连接MySQL数据库通过逆向工程简化开发流程

文章目录 一、使用步骤1、建立新项目2、引入pom依赖3、创建逆向工程的配置文件 generatorConfig.xml4、运行逆行工程&#xff0c;生成代码文件 二、案例展示1、建立数据表2、改写对应的配置文件内容1、数据库连接配置,指定自己的数据库2、配置pojo生成的位置3、配置sql映射文件…

新一代数据湖存储技术Apache Paimon入门Demo

目录 前言 1. 什么是 Apache Paimon 一、本地环境快速上手 1、本地Flink伪集群 2、IDEA中跑Paimon Demo 2.1 代码 2.2 IDEA中成功运行 3、IDEA中Stream读写 3.1 流写 3.2 流读&#xff08;toChangeLogStream&#xff09; 二、进阶&#xff1a;本地&#xff08;IDEA&…

【Java EE】Spring介绍

Spring笔记 1.概述1.1 IOC1.2.context上下文和bean1.3.AOP 2.IoC 控制反转2.1. Spring IoC容器和Bean简介2.2. 容器概述2.2.1. 配置元数据2.2.2. 实例化一个容器2.2.3. 使用容器 2.3. Bean 概览2.3.1. Bean 命名2.3.2. 实例化 Bean2.3.3 bean的生命周期 3.AOPAOP 概念 参考资料…

【微博-UITableViewController介绍 Objective-C语言】

一、加载xib文件的另外一种办法 1.我们说,加载xib,一种方式就是, CZFooterView *footerView = [[[NSBundle mainBundle] loadNibNamed:@“CZFooterView” owner:nil options:nil] lastObject]; 吧,这是一种方式, 2.另外一种方式,就是这里这种方式, UINIb *nib = [UI…

关于Jetpack DataStore(Preferences)的八点疑问

前言 DataStore是Android上一种轻量级存储方案&#xff0c;依据官方教程很容易就写出简易的Demo。 本篇主要是分析关于DataStore(Preferences)使用过程中的一些问题&#xff0c;通过问题寻找本质&#xff0c;反过来能更好地指导我们合理使用DataStore。 本篇内容目录&#xff…

浪涌保护器的不同类型解析

本页提到了不同的电涌保护器类型&#xff0c;即1型电涌保护器&#xff0c;2型&#xff0c;3型和4型电涌保护器。 它提到了电涌保护器类型&#xff0c;即GDT&#xff08;气体放电管&#xff09;&#xff0c;TSPD&#xff08;晶闸管浪涌保护装置&#xff09;&#xff0c;TVS&…

来赞达Lazada商品详情接口(item_get-根据ID取商品详情)代码封装

item_get-根据ID取商品详情接口 通过代码封装该接口可以拿到商品标题&#xff0c;商品价格&#xff0c;商品促销信息&#xff0c;商品优惠价&#xff0c;商品库存&#xff0c;sku属性&#xff0c;商品图片&#xff0c;desc图片&#xff0c;desc描述&#xff0c;sku图片&#xf…

记一次支付宝支付的功能开发

背景&#xff1a; 公司需要增加一项支付宝PC端的收款功能 解决&#xff1a; 使用的支付宝官方文档中的电脑网站支付->统一收单下单并支付&#xff0c;当然&#xff0c;我们的支付宝账号需要开通该产品。官方API连接&#xff1a;https://opendocs.alipay.com/open/028r8t?…