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. 2024-02-03:用go语言,你有 k 个背包。给你一个下标从 0 开始的整数数组 weights, 其中 weights[i] 是第 i 个珠子的重量。同时给你整数 k, 请你按照如下规则将所有

    2024-02-03:用go语言,你有 k 个背包.给你一个下标从 0 开始的整数数组 weights, 其中 weights[i] 是第 i 个珠子的重量.同时给你整数 k, 请你按照如下规则将所有 ...

  2. Kakfa系列丛书推荐之《深入理解Kafka:核心设计与实践原理》

    pdf格式文档下载见下文 编者推荐 本书从Kafka的基本概念入手,主要从生产端.消费端.服务端等3个方面进行全面的陈述,主要内容包括Kafka的基本使用方式.生产者客户端的使用.消费者客户端的使用. ...

  3. Python中Try/Except/else/final语句

    python中的try/except/else/finally语句   与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错误(pyt ...

  4. Java String类的replaceAll方法

    代码勇士真题: 给定一个字符串由a-z字母组成的字符串s,长度任意字母可任意组合. 要求编写函数找出s中不在a-m范围内的字母个数n,要求函数返回字符串格式为:n/s的长度 例如: s="a ...

  5. Qt+MySql开发笔记:Qt5.9.3的mingw32版本编译MySql8版本驱动并Demo连接数据库测试

    前言   之前特定的mysql版本msvc版本已经调通了,但是为了更好的跨平台,所以选择用mingw32版本,于是需要编译mysql驱动的mingw32版本的驱动库,以便提供给qt连接mysql使用. ...

  6. live555开发笔记(一):live555介绍、windows上msvc2017编译和工程模板

    前言   在pc上搭建流媒体服务器软件,打开视频接受推流,使用live555方案.   live555介绍   Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了标准流媒体传输 ...

  7. xml开发笔记(一):tinyXml2库介绍、编译和工程模板

    前言   Qt开发Xml相关技术,使用到tinyxml2库.   TinyXML   TinyXML是一个简单的.小的C++的XML解析器,可以集成到其他程序中.它是ROS的标准XML解析器.  最新 ...

  8. Java JVM——3.运行时数据区概述及线程

    运行时数据区概述 在JVM 中的位置 内部划分 当我们通过前面的:类的加载 → 验证 → 准备 → 解析 → 初始化 这几个阶段完成后,执行引擎就会对我们的类进行使用,同时执行引擎将会使用到我们的运行 ...

  9. React 组件懒加载

    只有不断学习和成长,才能适应这个快速变化的世界. 1. 懒加载 1.1 React 懒加载 React 中懒加载 Lazy 与 Suspense 需要搭配使用. React.lazy 定义: Reac ...

  10. 【LeetCode排序专题02】最小k个数,关于快速排序的讨论

    最小k个数 https://leetcode.cn/problems/smallest-k-lcci/ 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个 ...