行业知识
QT中网络编程之发送Http协议的Get和Post请求
文章目录
- HTTP协议
- GET请求
- POST请求
- QT中对HTTP协议的处理
- 1.QNetworkAccessManager
- 2.QNetworkRequest
- 3.QNetworkReply
- QT实现GET请求和POST请求
- Get请求步骤
- Post请求步骤
- 测试结果
使用QT的开发产品最终作为一个客户端来使用,很大的一个功能就是要和后端服务器进行交互。
当前使用的QT版本如下:
HTTP协议
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而 消息内容则具有一个类似MIME的格式。
GET请求
GET 从指定的资源请求数据。必要时,可以将查询字符串参数追加到URL的末尾,以便将信息发送给服务器。GET因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内。
POST请求
POST向指定的资源提交要被处理的数据。POST请求应该把数据作为请求的主体提交,请求主体(body)可以包括非常多的数据,且数据格式不限。POST请求是没有的长度限制,请求数据是放在body中。
QT中对HTTP协议的处理
Qt中提供了QNetworkAccessManager、QNetworkRequest和QNetworkReply,用于应用程序对网络访问的处理。
1.QNetworkAccessManager
QNetworkAccessManager 提供了应用程序通过网络发送请求的能力。
2.QNetworkRequest
QNetworkRequest 保存通过网络发送请求所需的信息。 它包含一个 URL 和一些可用于修改请求的辅助信息。
3.QNetworkReply
QNetworkReply 类封装了使用 QNetworkAccessManager 发布的请求相关的回复信息。QNetworkReply 是 QIODevice的子类,这意味着一旦从对象中读取数据,它就不再由设备保留。因此,如果需要,应用程序有责任保留这些数据。
QT实现GET请求和POST请求
项目结构预览:
头文件httpoperate.h内容:
#ifndef HTTPOPERATE_H#define HTTPOPERATE_H#include #include class HttpOperate:public QObject{ Q_OBJECTpublic: HttpOperate(); void SendPostRequst();//用于发送Post请求的成员函数 void SendGetRequst();//用于发生Get请求的成员函数private: QNetworkAccessManager* mNetworkManager; QNetworkReply* mReply;public slots: //类中做槽函数的成员函数一般写在public slots下,Qt5以及以上版本可以不写public slots void ReplyFinshed();};#endif // HTTPOPERATE_H源文件httpoperate.cpp中的内容:
#include "httpoperate.h"#include #include #include #include HttpOperate::HttpOperate() {}void HttpOperate::SendGetRequst(){ mNetworkManager = new QNetworkAccessManager(this); QNetworkRequest _quest; QString url = "http://127.0.0.1:8083/v3/api/client/v1/captchaImage"; url.append("?key1=小强&key2=xiao qing"); _quest.setUrl((QUrl(url))); _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); mReply = mNetworkManager->get(_quest); QByteArray _data = mReply->readAll();//读出数据 //QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData(); qInfo()//这里的信号的接受者可以省略不写 ReplyFinshed(); }); qInfo() mNetworkManager = new QNetworkAccessManager(this); QNetworkRequest _quest; _quest.setUrl((QUrl("http://127.0.0.1:8083/v3/api/client/v1/createSignature"))); // _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); QJsonDocument document; QJsonObject obj; obj.insert("key1", "小明"); obj.insert("key2", "xiao hong"); document.setObject(obj); QByteArray _postData = document.toJson(QJsonDocument::Compact);//以Json字符串的方式传参 mReply = mNetworkManager-post(_quest,_postData); QByteArray _data = mReply-readAll();//读出数据 qDebug() ReplyFinshed(); });//方式三 qDebug() if (mReply-error() == QNetworkReply::NoError) { // 处理返回的数据 QByteArray _data = mReply-readAll();//读出数据 auto toUtf16 = QStringDecoder(QStringDecoder::Utf8); QString str = toUtf16(_data); qInfo() // 处理错误 qDebug() QCoreApplication a(argc, argv); HttpOperate hoper; hoper.SendPostRequst();//发起Post请求测试 HttpOperate hoper1; hoper1.SendGetRequst();//发起Get请求测试 return a.exec();//主程序会在这里阻塞}
最新文章
- 期货服务器怎么登录?
- Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习:创建并调用函数-字符集合的并集-上机代码
- RustDesk连接客户端提示key不匹配 Key Mismatch无法连接(已解决)
- 物理主机怎么重服务器?
- 相机下载小说的详细步骤指南
- squad怎么搞服务器?
- es怎么ftp服务器?
- 免费网站模板使用指南,轻松打造吸引眼球的网站!
- Upload 上传(图片/文件),回显(图片),下载(文件)
- uniapp 生成二维码(可设置logo、前景色、背景色等),扫描二维码(uni.scanCode、barcode自定义扫码可连续扫码),Android\ios可用