Java和Qt如何实现multipartfile表单的请求

2023-05-16

一、背景

        做项目经常需要跟其他单位/公司对接,由于成本等方面的考虑,不可能多家单位一直坐在一起开发。

        一般的解决办法是,自己的B端、C端先与自己的服务端对接,基本功能开发完成,再将自己的服务端与对方的服务端对接。

        所以就会遇到Java请求其他服务接口的问题,Get、Post发JSON数据都比较简单。最近遇到了需要发送复杂表单数据的情况,比如普通字段数据与文件一起发给对方。

二、遇到的问题

        很多做Java开发的,只知道怎么跟B端对接,但是并不清楚HTTP层到底发送的什么数据,即他不知道自己接收的什么数据,所以做Java端或者C端去请求那个接口,得猜一下数据格式。

        GET没什么好说的,主要是POST。

        POST的body中一般装载Json数据;普通表单也很常见,即body中多个参数用key1=value1&key2=value2的形式。

        如果需要发送的数据除了普通字段数据,还包含文件,尤其是二进制文件,就肯定是复杂表单了,Content-Type为“multipart/form-data”,如下图:

三、Java写法

String url = "https://api.baidu.com/xxx/xxx/xxx";
// 组装数据
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formdata.add("name", getName());
...
{
    String filePath = "D:\xx\xx\xx";
    formData.add("file", new FileSystemResource(new File(filePath)));
}
// 设置Http请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
// 封装请求对象
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(formData, httpHeaders);
// 请求网络
RestTemplate restTemplate = new RestTemplate();
String responseString = resTemplate(url, httpEntity, String.class);

        给我最大的困扰是文件用什么对象,网上资料多是前端请求后端的Java写法,让用MultipartFile对象,添加进去一直报错。用“octet-stream”才搜索到我想要的,即需要FileSystemResource对象。

        另一处关键的地方是MediaType.MULTIPART_FORM_DATA,即指定body中的数据类型。

四、Qt写法

// 网络请求对象
QNetworkRequest request;
request.setUrl(QUrl("https://api.baidu.com/xx/xx"));
// 发送的数据
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
{ // 普通字段
    QHttpPart httpPart;
    httpPart.setBody(xxx);
    httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"xxx\";");
    multiPart->append(httpPart);
}
...
{ // 文件
    QFile *pFile = new QFile(xxx);
    pFile->open(QIODevice::ReadOnly); // 必须打开不能关闭
    pFile->setParent(multiPart); // 加了这句,pFile就不需要delete了
    //
    QHttpPart httpPart;
    httpPart.setBodyDevice(pFile);
    httpPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
    httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"xx\"; filename=\"xx\";");
    multiPart->append(httpPart);
}
...
// 网络请求
QNetworkAccessManager accessManager;
QNetworkReply *reply = accessManager.post(request, multiPart);
multiPart->setParent(reply); // multiPart不需要delete了
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
// 获取返回的数据
QString responseString = QString(reply->readAll());

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java和Qt如何实现multipartfile表单的请求 的相关文章

随机推荐

  • Android 利用V4L2 调用camera

    为何要使用V4L2进行开发 出于安全原因 xff0c 使用Android 原生的Camera接口 xff0c 必须要使用可见的surface显示摄像头的preview图像 xff0c 即必须要让用户看到你的应用正在使用摄像头 另外Andro
  • MySql 8.0 设置允许远程登录授权

    MySQL 连接出现 is not allowed to connect to this MySQL Server错误提示 打开 MySQL8 0 Command Line Client 1 打开远程连接 mysql span class
  • 基于Jeecg的权限获取

    Jeecg的权限 xff0c 是通过菜单管理中的 按钮 权限 实现的 xff0c 前端和后端怎么获取这个权限呢 xff0c 本文简单做个记录 1 前端 import USER AUTH from 34 64 store mutation t
  • 基于Jeecg使用vue-konva

    konva是一个基于canvas的可视化框架 xff08 https konvajs org xff09 xff0c vue konva则是基于vue的 当前的一个小项目是基于Jeecg开发的 xff0c 想做可视化的功能 xff0c 于是
  • 基于JeecgBoot的v-has权限控制

    v has是一个很方便的前端权限控制标签 xff0c 但是只支持一个授权标识 xff0c 如果需要两个或以上的权限与或运算就不支持了 解决方案 xff1a 修改文件 64 utils hasPermission js 中的方法filterG
  • 前后端离线开发相关软件下载地址大全

    一 后端开发 xff1a 1 IDEA Windows xff1a https www jetbrains com zh cn idea download section 61 windows 2 JDK Windows xff1a htt
  • 离线部署GitLab

    一 背景 公司是局域网开发环境 xff0c 资源文件用svn管理 xff0c 代码用git管理 GitLab有点大 xff0c 而且只能在Linux下使用 xff0c 所以选择了轻巧的GitBlit 后来GitBlit被暴漏洞 xff0c
  • C# WPF实战项目升级了

    概述 之前用Caliburn Micro搭建的WPF实战项目 xff0c CM框架选用了 3 0 3 xff0c 实际上CM框架目前最新版已经到4 0 173了 xff0c 所有很有必须升级一下项目了 本来打算把平台框架也直接升级到 NET
  • 接入Swagger2(1) —— SwaggerUI

    关于Swagger不再多述 xff0c 这里只分享接入方式 1 接入 SpringBoot中引入Swagger相当简单 xff0c 只需要添加一个依赖就行 xff0c 如下 xff1a lt dependency gt lt groupId
  • 接入Swagger2(2) —— knife4j

    上一篇文章介绍了Swagger2默认UI的接入方式 xff0c 但是UI实在太丑 xff0c 而且布局也很难用 xff0c 这里介绍一个相对漂亮点的UI knife4j knife4j是基于swagger2开发的 xff0c 是swagge
  • SpringSecurity的使用(1)—— 起步

    年初就关注到SpringSecurity了 xff0c 看官网 xff0c 看不懂 xff1b 查资料 xff0c 跟我预想的不一样 xff0c 所以一直入不了门 有博文说添加依赖 xff0c 再次启动项目就会跳转到登录页面 我是前后端分离
  • 离线模式:Unresolved dependency: ‘com.xx.xx:xx-xx:jar:x.x.x‘

    SpringBoot最常用的编译器就是IDEA xff0c 如果不能联网 xff0c 则需要将工程设置为离线模式 1 遇到的问题 这两天遇到了这样的问题 xff1a JeecgBoot的工程中有添加依赖包 knifej spring boo
  • SpringBoot中Java调用dll

    1 背景 最近接手的项目 xff0c 底层算法是C 43 43 写的 xff0c 并且封装成了dll 而目前的需求 xff0c 需要把这些算法移到服务端执行 不可能把C 43 43 写的算法库改用Java重写一遍 xff0c 而且也基于执行
  • 接入Shiro(1)——极简登录认证

    Shiro是一个强大易用的Java安全框架 xff0c 提供了认证 授权 加密和会话管理等功能 之前的开发都是在低代码上直接使用Shiro xff0c 一般也不需要修改 在SpringBoot的基础上 xff0c 只接入Shiro的登录认证
  • 接入Shiro(2)——基于JWT的登录认证

    前文讲到基于Shiro的登录认证 xff0c 只是对前端传来的token长度做了判断 xff0c 并没有与用户关联 本文将分享用户登录 Token创建 Token验证三个关键环节的用法 xff0c 其中用户登录只对用户名和密码做简单的比对
  • VS2017离线安装

    因开发环境限制 xff0c 不联外网开发是一种很常见的情况 xff0c 但官方似乎不提供vs2017离线安装包 几经周折 xff0c 终于找到了解决办法 1 vs2017下载地址 Visual Stduio 旧版本下载地址 Visual S
  • Invalid or corrupt jarfile xxx.jar

    一 遇到的问题 Artifacts打包的特点是 xff0c 目录下会生成一大堆jar包 xff0c 各个依赖包都是独立存在的 xff0c 更新时只替换开发包即可 之前一直用Artifacts打的包 xff0c 会生成MANIFEST MF文
  • GitLab的备份与还原

    一 现状 前段时间在麒麟系统上部署了GitLab xff0c 后来发现太占资源 xff0c 于是准备在Ubuntu Desktop版本上部署GitLab Ubuntu Desktop出预装了浏览器 xff0c 感觉不会比麒麟轻太多 之前安装
  • 如何使用Sublime的插件(以HexViewer为例)

    1 打开Package Control功能 xff1a 在sublime任意界面按下ctrl 43 xff08 注意是键盘左上角的 xff09 xff0c 会在界面最下方弹出一个编辑框 xff0c 输入如下内容 xff08 注意区分Subl
  • Java和Qt如何实现multipartfile表单的请求

    一 背景 做项目经常需要跟其他单位 公司对接 xff0c 由于成本等方面的考虑 xff0c 不可能多家单位一直坐在一起开发 一般的解决办法是 xff0c 自己的B端 C端先与自己的服务端对接 xff0c 基本功能开发完成 xff0c 再将自