QNetworkAccessManager 的使用

非阻塞式的:

   // client.h 

class Client : public QObject {
        Q_OBJECT
    public:
        explicit Client(const QString &url);
        void sendData(const QString &data);
    public slots:
        void replyFinished(QNetworkReply* reply);
    private:
        void waitForFinish(const QHttp  &http);
        QNetworkAccessManager* m_manager;
        QString mUrl;
};

// client.cpp

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>

Client::Client(const QString &url) {
    mUrl = url;
    m_manager = new QNetworkAccessManager(this);
    connect(m_manager, SIGNAL(finished(QNetworkReply*)), this,
            SLOT(replyFinished(QNetworkReply*)));
}

void Client::replyFinished(QNetworkReply* reply) { // 应答槽函数
    if (reply && reply->error() == QNetworkReply::NoError) {
        QByteArray data = reply->readAll();
        qDebug() << "---------------------------------\n" <<  data;
    } else {
        // error
    }
    reply->close();
}

void Client::sendData(const QString &data) { // data为发送的数据
    QNetworkRequest request;
    request.setUrl(QUrl(mUrl)); // 设置url
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); // 设置头信息
    m_manager->post(request, data.toUtf8());
}

阻塞式的:

QString Client::sendData(const QString &data) {
    m_manager = new QNetworkAccessManager(this);
    QNetworkRequest request;
    QEventLoop loop; // 使用QEventLoop实现阻塞
    QNetworkReply *reply;

    request.setUrl(QUrl(mUrl));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    reply = m_manager->post(request, data.toUtf8());

    connect(m_manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit())); // connect
    loop.exec();
    QByteArray byteArray = reply->readAll();
    qDebug() << byteArray;
    delete reply;
    delete m_manager;
    return QString(byteArray);
}
时间: 2024-10-07 22:36:25

QNetworkAccessManager 的使用的相关文章

为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)

在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获.但是如果是第三方软件限制程序联网,问题来了. 程序会一直在那里等待,没有异常,也不发送QNetworkAccessManager::finsh和QNetworkReply::error和QNetworkReply::finsh信号. 所以动念头为下载加个超时,但是QNetworkAccessManager,QNetworkReply和QNetworkRequest都没有相关的设置函数.其实仔细想一下,也没有

在多个线程中使用QNetworkAccessManager

最近发现Tangram发出了URL request, 但是却收不到URL reponse 经研究后发现这是一个线程问题: Tangram会在多个线程发送URL request, 但是在实现时, 却没有考虑线程问题, 程序在运行时得到如下warning: QObject: Cannot create children for a parent that is in a different thread. (Parent is QNetworkAccessManager(0x21dcba0), pa

qt截获html请求(继承QNetworkAccessManager和QNetworkReply)

QtWebkit加载html页面,html中会有很多的请求,比如<img id="testImg" src="http://*.jpg" width="200" height="200" title="test图片"/>等等,如果想截获这些请求,然后自定义应答... 1.定义一个类,继承QNetworkAccessManager(请求) #ifndef NETWORKACCESSMANAGER_

Qt5---ftp上传功能(使用组合的办法实现功能,QNetworkAccessManager自动管理分片上传,用QLoggingCategory屏蔽SSL警告)

  从Qt的版本进化中可以知道,在Qt4中的QFtp类到了Qt5中已经没有了,虽然可以通过在Qt5中自己编译出QFtp,但是Qt5中提供的QNetworkAccessManager在发送和请求网络方面有更好的兼容性和扩展性,包括ftp请求和http请求.   这里提供一个Qt4中QFtp的源码获取方式: git clone git://code.qt.io/qt/qtftp.git git clone http://code.qt.io/qt/qtftp.git git clone https:

QT QNetworkAccessManager 如何支持RESTFul的HTTP Patch方法

HTTP Patch方法是除了post,get,put,delete之外的一个新方式, 网上查不到的,也算是独家吧: 主要用下面这个方法: QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = 0); 代码: QNetworkAccessManager *_qnetwork = new QNetworkAccessManager()

Qt之处理QNetworkAccessManager网络连接超时

简述 在网络操作中,经常会由于各种原因引起网络连接超时,究竟何为网络连接超时? 网络连接超时:在程序默认的等待时间内没有得到服务器的响应 简述 超时原因 Qt 中的网络连接超时 超时原因 引起网络连接超时的原因很多,下面,列举一些常见的原因: 网络断开,不过经常显示无法连接 网络阻塞,导致你不能在程序默认等待时间内得到回复数据包 网络不稳定,网络无法完整传送服务器信息 系统问题,系统资源过低,无法为程序提供足够的资源处理服务器信息 设备不稳定,如网线松动.接口没插好等等 网络注册时系统繁忙,无法

qt QNetworkAccessManager https

QString para = QString("?mac=%1&bd=%2&uid=%3&frpoc=%4").arg(gMac).arg(gBarid).arg(gUid).arg(nowProcName); QUrl url(QString("%1%2").arg(chkPopupAdUrl).arg(para)); QByteArray byte_array; QNetworkAccessManager manager; QEventL

Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)

简述 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容需要SSL.它是一个URI scheme(抽象标识符体系),句法类同http:体系.用于安全的HTTP数据传输.https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之

Qt之HTTP上传/下载(继承QNetworkAccessManager,包括使用了authenticationRequired认证信号)

效果 QNetworkAccessManager DownloadNetworkManager::DownloadNetworkManager(QObject *parent) : QNetworkAccessManager(parent) { // 获取当前的时间戳,设置下载的临时文件名称 QDateTime dateTime = QDateTime::currentDateTime(); QString date = dateTime.toString("yyyy-MM-dd-hh-mm-s