PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=036)

  本文发布于 2017-08-07 17:32:52,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=036)

环境说明

  Ubuntu 16.04 LTS

  抓包工具:wireshark

前言


  无

Qt HTTP


  1. Qt网络相关的三个主要类QNetworkAccessManager,QNetworkRequest,QNetworkReply。一般的使用方法就是:QNetworkRequest添加头和地址等信息,QNetworkAccessManager发起请求,QNetworkReply对服务器回应的响应。

  2. 关于Qt实现一般的POST和GET,其实我们去看帮助文档就可以了,如下图所示。

  通过这里我们可以发现,get的话只需要把request信息填好,交给manager提交就好了。重点我们需要关注post的几个重载函数。本文只分析第二个和第三个,第一个没用过,不清楚。


QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data)//此函数,就是非常裸奔的模拟表单请求,虽然比较复杂,但是绝对直观有效。 QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart)//此函数就是Qt官方带的多表单的Post正式的方法
  1. 在具体分析之前,我不得不说一说HTTP协议的部分内容。(这里本人强烈建议,如果要分析各种网络协议,请使用wireshark,她会在网络五层结构中清晰的展现内容)

    3.1 下面是一个普通http请求的抓包截图(打开csdn官网)

  图中是典型的HTTP GET请求的内容。我们要关注的就是User-Agent、Accept、Get这几个域就可以了

  上图就是一个典型的POST 多表单请求抓包分析。我们只需要关注:Content-type这个最重要的域。后面MIME multipart部分就是上传的图片。这里最重要的是type中的boundary这是一个唯一的字符串,做标识使用,也做为表单的不同域的分隔符。

    3.2 对于详细的HTTP 协议的分析,请自行百度,这里就不做详细的分析。

  1. 关于Qt 官方正式 multipartform 实例代码(其实这里就是:QHttpMultiPart、QHttpPart)(主体部分来至于Qt帮助文档,但是这个example有点毛病的)
    proc_request = new QNetworkRequest();
proc_manager = new QNetworkAccessManager();
connect(proc_manager,SIGNAL(finished(QNetworkReply*)),\
this,SLOT(YOUR_SLOT_FUNCTION(QNetworkReply*)));//连接槽函数 QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart textPart;
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
textPart.setBody("my text"); QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image\""));
QFile *file = new QFile("image.jpg");
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart multiPart->append(textPart);
multiPart->append(imagePart); proc_request->setUrl("http://xxxxxxxxxxxxx");
//**************自我添加部分****************************
QString bd = "fasdlkfjaslkdgj;lkadjglk;";
multipart->setBoundary(bd.toLatin1());
proc_request->setHeader(QNetworkRequest::ContentTypeHeader,\
"multipart/form-data;boundary="+bd);
//****************自我添加部分*************************
proc_manager->post(*proc_request,multiPart);

  对于上面代码的分析:我不知道为何,只有我显示指定Boundary之后,才能够正确提交post,所以自我添加部分是非常重要的,不加就是不行,这是在实际分析出的。(官方关于这个问题的说明:Usually, you do not need to generate a boundary yourself; upon construction the boundary is initiated with the string "boundary_.oOo._" followed by random characters, and provides enough uniqueness to make sure it does not occur inside the parts itself.)(上面说其实我们不显示指定,它也是会自动给你添加boundary的,但是我的项目中就不行,估计是我项目中哪里没弄对吧,不去折腾了,我就显示指定了,如果有那个童鞋去实验一波,不用指定也可以成功post,请来告诉我一声,哎,真特么蛋疼,下班了~~~~~~~~~)

后记


  无

参考文献


打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

Qt HTTP网络相关GET,POST(HTTP 模拟POST 表单(multipartform)最简单和正式的方法)的更多相关文章

  1. .Net模拟提交表单

    2016-09-0210:49:20 以中邮速递API为服务接口,由于提交方式为表单提交,我要获取返回值来处理其他业务,所以一开始尝试采用Js后台获取返回值,但是涉及到跨域请求限制问题,那边服务端接口 ...

  2. 通过HttpURLConnection模拟post表单提交

    通过HttpURLConnection模拟post表单提交 package junit; import java.io.InputStream; import java.net.HttpURLConn ...

  3. nodejs 模拟form表单上传文件

    使用nodejs来模拟form表单进行文件上传,可以同时上传多个文件. 以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的 ...

  4. js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题

    js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...

  5. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  6. 通过JS模拟select表单,达到美化效果[demo][转]

    转自: http://www.cnblogs.com/dreamback/p/SelectorJS.html 通过JS模拟select表单,达到美化效果 Demo ------------------ ...

  7. 通过JS模拟select表单,达到美化效果[demo]

    .m-form{background:#fff;padding:50px;font-family:12px/1.5 arial,\5b8b\4f53,sans-serif;} .m-form ul,. ...

  8. Linux curl 模拟form表单提交信息和文件

    Linux curl 模拟form表单提交信息和文件   curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...

  9. js 上传文件模拟Form 表单

    使用FormData对象 在本文章中 创建一个FormData对象 使用HTML表单来初始化一个FormData对象 使用FormData对象发送文件 利用FormData对象,你可以使用一系列的键值 ...

  10. 【HTML相关】iframe+javascript实现一个表单提交后多个处理文件按序处理

    最近在弄一个网页的问题,总结如下. [问题描述] 页面中包括以下几个部分:1)表单form,供用户输入图片文件:2)iframe1,显示a.php文件的内容,a.php接收客户端图片并保存,后台程序处 ...

随机推荐

  1. Windows—通过Navicat导入MySQL示例数据库employees

    Navicat是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL.Oracle.PostgreSQL.SQLite.SQL Server.MariaDB .MongoDB 等不同类型的数据 ...

  2. 罗克韦尔 FT View使用占位符(全局对象参数)来指定弹出窗口的显示名称

    罗克韦尔 FT View使用占位符(全局对象参数)来指定弹出窗口的显示名称 标签占位符 标签占位符能实现将单个图形显示用于多个相似的操作,从而节省开发和维护应用程序的时间. 例如,要为使用同一台机器将 ...

  3. 从零开始手写缓存框架(二)redis expire 过期原理及实现

    前言 我们在 从零手写 cache 框架(一)实现固定大小的缓存 中已经初步实现了我们的 cache. 本节,让我们来一起学习一下如何实现类似 redis 中的 expire 过期功能. 过期是一个非 ...

  4. js数组类型

    js数组类型: 数组检测 1.判断变量是否为数组类型: arr1 instanceof Array Array.isArray(arr1); true 转换方法 toString()方法,以便返回数组 ...

  5. dd命令创建文件

    dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...

  6. 异常处理之raise A from B

    raise A from B 语句用于连锁chain异常 from 后面的B可以是: - 异常类 - 异常实例 - None 如果B是异常类或者异常实例,那么B会被设置为A的__cause__属性,表 ...

  7. centos7安装桌面-GNOME

    CENTOS7安装桌面系统 GNOME桌面 # yum安装 # 更新已安装软件 yum upgrade -y # 安装额外yum源 yum install epel-release -y # 安装X ...

  8. 【LeetCode回溯算法#02】组合总和III

    组合总和III 力扣题目链接(opens new window) 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字 ...

  9. jupyterlab安装和优化

    说明 JupyterLab(官网https://jupyter.org)是一个交互式的代码编辑器,打开它会打开一个网页,可以在其中编写代码,即时执行,快速得到结果(包括代码返回值.统计图和界面交互图) ...

  10. 我的第一个项目(八):(解决问题)图片资源无法加载(Error: Cannot find module "../../xxx" )

    好家伙,问题一堆   先开一个测试页模拟游戏模块的运行 原先的图片初始化方法失效了,(vue里面自然是用不了这种方法的) function createImage(src) { let img; if ...