您现在的位置是:首页 >技术教程 >用蹩脚英语在StackOverflow上飞奔:试看以色列兄弟自荐的Http文件上传工具MgntUtils网站首页技术教程
用蹩脚英语在StackOverflow上飞奔:试看以色列兄弟自荐的Http文件上传工具MgntUtils
上班摸鱼、下班干活,日常埋坑、加班填坑——这是我的搬砖,亦是在座的各位!
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类,其中除了基本的设置一些请求参数外,对外调用主要是两种方法sendHttpRequest和sendHttpRequestForBinaryResponse,区别在于返回的数据类型。
点进入sendHttpRequest方法内部我们可知,原来他使用的是JAVA原生的HttpURLConnection来实现http接口请求的哇,果然还是印证了那句至理名言——最初的才是最好的!
不慌,那么我们再稍微看看这个sendRequest方法内部干了啥。
- 打开一个httpURLConnection连接。
- 获取一个输出流DataOutputStream。
- 把请求参数写入。
完了,方法就这么几行,都是些熟悉的不能再熟悉的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等)