您当前的位置: 首页 >  http

龚建波

暂无认证

  • 3浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt实现HTTP客户端操作

龚建波 发布时间:2019-07-27 23:01:22 ,浏览量:3

(2019-7-27写的笔记,2021-7-21更新部分代码)

0.前言

本文是Qt中HTTP相关接口一个简单总结,主要是get/post请求以及表单提交等应用,HTTP相关知识自行百度。

下一篇,文件上传下载:https://gongjianbo1992.blog.csdn.net/article/details/119490369

1.简介

从Qt4.4开始,引入了QNetworkRequest、QNetworkReply 和 QNetworkAccessManager等类来进行HTTP、FTP的操作,替代之前的QFtp和QHttp。要使用这些类,先在pro文件中引入network模块:

QT += network
2.认识QNetworkAccessManager

网络访问API围绕一个QNetworkAccessManager对象构建,该对象包含其发送的请求的通用配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号,以及可用于监控网络操作进度的回复信号。由于QNetworkAccessManager基于QObject,因此只能从它所属的线程中使用它。

创建QNetworkAccessManager对象后,应用程序就可以使用它通过网络发送请求。 该类提供了一组标准函数,它们接收请求和可选数据,每个函数都返回一个QNetworkReply对象。返回的对象用于获取响应相应请求而返回的任何数据。

//构建一个manager对象
QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
//manager具有异步API,当http请求完成后,会通过finished信号进行通知
connect(manager,&QNetworkAccessManager::finished,this,&MyClass::replyFinished); 
//发送异步get请求
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

//这里也可以用一个QEventLoop来等待请求完成,但是我更爱用槽函数
//QNetworkReply *reply=manager->get(request);
//QEventLoop eventLoop;
//connect(reply, &QNetworkReply ::finished, &eventLoop, &QEventLoop::quit);
//eventLoop.exec();
//QByteArray reply_data=reply->readAll();

QNetworkAccessManager将收到的请求排队。并行执行的请求数取决于协议。 目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。请求完成后,用户有责任在适当的时间删除QNetworkReply对象。不要在连接到finished()的插槽内直接删除它,可以使用deleteLater()函数。

通过Operation枚举可以看支持的请求方式:

可以看到,HTTP的常用请求方式都有对应的方法,并且提供了自定义的接口。

也可以通过supportedSchemes()方法查看支持的协议:

QNetworkAccessManager *manager=new QNetworkAccessManager(this);
//查看支持的协议
qDebug()get(request);
//manager->post(request, QByteArray());
//manager->put(request, QByteArray());

有时需要在url中携带参数,如果手动进行字符串拼接不是很方便。Qt5.0提供了 QUrlQuery类,可以很方便的拼接和解析url中的参数。

QUrl url("http://httpbin.org/get");
    
//拼接
QUrlQuery query;
query.addQueryItem("ie","utf-8");
url.setQuery(query);
qDebug()            
关注
打赏
1655829268
查看更多评论
0.2730s