[QT開發]網絡編程中,發送請求成功,無法接收回信

問題描述

使用qt的網絡編程,那麼一定要使用QNetworkAccessManager類,然後配合QNetworkRequest和QNetworkReply使用。

  • QNetworkRequest : 這個類可以發送get請求或者post請求,分別對應get和post方法
  • QNetworkReply : 這個類是接收請求之後的迴應

請求成功之後QNetworkAccessManager會發射一個finished信號,我們只要給它匹配一個槽函數,那麼就可以在槽函數處理迴應的內容了。
問題就在這裏,有時候我們指定的槽函數,得不到迴應,並不是槽函數沒有被調用,而是迴應爲空

代碼例子

void Util::httpRequest(QString url, QString method, QString outputStr)
{
    if( !mNetManager ) {
        mNetManager = new QNetworkAccessManager(this);
    }
    //構造http請求
    QNetworkRequest req;
    QSslConfiguration config;
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::TlsV1SslV3);
    req.setSslConfiguration(config);
    req.setUrl(QUrl(url));
    QNetworkReply *reply = NULL;
    if( !method.compare("GET")) {
        reply = mNetManager->get(req);
    }
    if( outputStr != NULL) {
        //使用utf-8上傳post請求數據
        //如果使用outputStr.toLatin1()的話,那麼微信客戶端產生的菜單是亂碼
        reply = mNetManager->post(req, outputStr.toUtf8());
    }
//qDebug() << "http requst start....";
    connect(mNetManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(on_httpRequest_slot(QNetworkReply*)));
}

void Util::on_httpRequest_slot(QNetworkReply *reply)
{
    QString str(reply->readAll());
Log::log(QString("on http request %1").arg(str));
Log::log(str);
    emit returnMsg(str);
}
QString str(reply->readAll());

上面那一行得到迴應的str爲空

解決辦法

上面的代碼可以使用qt自帶的工具打包,只要使用windeployqt命令就能夠打包成課運行的程序,打包方法如下:
自學QT之windeployqt工具的使用
上面的程序因爲使用QSsl,也就是使用了https連接,這個需要的dll文件需要自己下載,名字就叫做libeay32.dllssleay32.dll這兩個dll文件,放在打包後的目錄下面,網絡訪問就可以恢復正常.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章