当前位置: 首页 > article >正文

MultipartEntityBuilder实现多附件上传

现在很多平台都会遇到与其它系统集成的情况。其中之一是调用第三方接口传输业务数据并上传文件。比如对方提供了这样一个文档:

我们可以先通过postman工具测试对方提供的接口,成功后可以通过该工具生成java代码使用,postman使用的是OkHttpClient来构建的请求。

这里我介绍的是MultipartEntityBuilder。

MultipartEntityBuilder是Apache HttpClient库中的一个实用工具,用于构建HTTP POST请求的多部分实体,它可以帮助开发人员轻松地将二进制数据添加到请求中,实现附件上传。

在MultipartEntityBuilder构建多部分实体时有一个比较重要的类是HttpMultipartMode,这个定义了如何将请求的各个部分组合在一起。HttpMultipartMode有几种不同的模式可供选择。

HttpMultipartMode.RFC6532:该规范定了定义了如何在multipart实体中处理unicode字符和国际化文本,该模式不会添加额外的空行。

HttpMultipartMode.BROWSER_COMPATIBLE:兼容浏览器模式,会在multipart实体的各部分之间添加一个额外的空行,已解决一些浏览器在解析multipart实体时可能出现的问题。

HttpMultipartMode.STRICT:严格模式,按照HTTP协议规定的格式来构建multipart实体,不会添加额外的空行。

最近在于第三方系统对接时,调用对方的接口上传文件,调用成功后到对方系统查看附件的文件名始终是乱码。后来发现,是MultipartEntityBuilder需要setMode(HttpMultipartMode.RFC6532)。

完整代码:

ContentType contentTypeJson = ContentType.create("application/json","UTF-8");

MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();

multipartEntityBuilder.setCharset(StandardCharsets.UTF_8);
multipartEntityBuilder.setMode(HttpMultipartMode.RFC6532);//设置模式,防止传输附件到第三方系统文件名乱码
multipartEntityBuilder.seContentType(ContentType.MULTIPART_FORM_DATA);

multipartEntityBuilder.addTextBody("data", jsonString, contentTypeJson);//设置请求格式

File file1 = new File("文件路径");

File file2 = new File("文件路径");

multipartEntityBuilder.addBinaryBody("files", new FileInputStream(file1), ContentType.DEFAULT_BINARY, file1.getName());

multipartEntityBuilder.addBinaryBody("files", new FileInputStream(file2), ContentType.DEFAULT_BINARY, file2.getName());

HttpPost httpPost = new HttpPost(请求接口地址);
httpPost.setEntity(multipartEntityBuilder.build());//将构建好的请求体放到HttpPost中。

String respContent="";
try {
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity =  httpResponse.getEntity();
            respContent = EntityUtils.toString(httpEntity,"UTF-8");
            System.out.println("result:"+respContent);
} catch (Exception e) {
            e.printStackTrace();
} finally {
            httpPost.releaseConnection();// 释放链接
}


http://www.kler.cn/a/1317.html

相关文章:

  • 自动化测试脚本实践:基于 Bash 的模块化测试框架
  • leetcode 面试经典 150 题:两数之和
  • Figma如何装中文字体-PingFang苹方字体、Alibaba PuHuiTi阿里普惠
  • 基于Python实现的通用小规模搜索引擎
  • python无需验证码免登录12306抢票 --selenium(2)
  • GO随记:不使用主键id 如何分表与mysql大表
  • day10-字符串作业2
  • spring三级缓存以及@Async产生循环引用
  • 【Kubernetes】第二十八篇 - 实现自动构建部署
  • 枚举
  • 计算机组成原理笔记——计算机性能指标(CPI、IPS、MIPS等)
  • Vue项目结合Turn.js制作翻页动画,项目部署发布,从零到1
  • 自主HttpServer实现(C++实战项目)
  • 带你了解Redis及安装Redis的全过程
  • mongodb文档操作1
  • 【C语言经典例题】求最小公倍数
  • 长肥网络与TCP的长肥管道
  • 漫画:什么是选择排序?
  • 比df更好用的命令!
  • 一行代码“黑”掉任意网站
  • 关键字 const
  • 没有关系的话,那就去建立关系吧
  • 各种交叉编译工具链的区别
  • 【宝塔面板部署nodeJs项目】网易云nodeJs部署在云服务器上,保姆级教程,写网易云接口用自己的接口不受制于人
  • 第一个 Qt 程序
  • 数论作业 —— 公约数公倍数问题