标签: qnetworkaccessmanager

无法从QNetworkAccessManager访问Ssl错误列表

我正在开发一个项目,我正在尝试通过REST请求向我们的Web服务发送请求.首先我只将finished(QNetworkReply*)信号连接到一个插槽,但由于ssl问题它从未完成,我也试图连接sslErrors(QNetworkReply*, const QList<QSslError>&)插槽,因为请求是https.

connect(&_accessManager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), 
        this, SLOT(printSslErrors(QNetworkReply*, const QList<QSslError>&)));
Run Code Online (Sandbox Code Playgroud)

然后在我的打印功能中,我无法以任何方式访问错误列表.

void AssetManager::printSslErrors(QNetworkReply *reply, const QList<QSslError>& errors) {
     ...
}
Run Code Online (Sandbox Code Playgroud)

我试过了:

const QSslError test = errors.at(0); // error on 'test' 
QSslError test = errors.at(0); // error on 'test'
Run Code Online (Sandbox Code Playgroud)

要么

foreach(QSslError error, errors) {
    qDebug() << error.errorString(); // error on 'errors'
}
for(int i = 0; i < errors.count(); i++) {
     qDebug() << errors.at(i).errorString(); // error on 'errors'
}
Run Code Online (Sandbox Code Playgroud)

这导致:

错误C2079:'test'使用未定义的类'QSslError'
错误C2440:'initializing':无法从'const QSslError'转换为'int'

要么

错误C2027:使用未定义类型'QSslError'
错误C2228:'.toString' …

c++ ssl qt undefined qnetworkaccessmanager

1
推荐指数
1
解决办法
2710
查看次数

使用 QNetworkAccessManager 的 Qt 控制台应用程序

我正在尝试编写一个Qt调用 Web 服务的应用程序。这是一个控制台应用程序,url 将作为命令行参数传入。我搜索了示例http程序Qt并找到了这个链接:

http://qt-project.org/doc/qt-5/qnetworkaccessmanager.html

这里有以下代码示例:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(replyFinished(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
Run Code Online (Sandbox Code Playgroud)

现在,如果我把它粘贴到我的控制台应用程序中main,我显然会收到构建错误,因为this它不存在。我得到:

invalid use of 'this' in non-member function
Run Code Online (Sandbox Code Playgroud)

QNetworkAccessManager非 GUI/控制台类型的应用程序是否有等价物?

c++ qt qnetworkaccessmanager

1
推荐指数
1
解决办法
3887
查看次数

使用 QNetworkAccessManager 下载 QT 文件

我正在尝试使这个问题中的代码起作用。 qt - 如何通过http下载和保存图像?

它会创建文件,但不会向其中写入任何数据。我最好的猜测是连接到信号和插槽不起作用。我究竟做错了什么?

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    QString getPageImage(QString url = "");
    bool saveToDisk(const QString &filename, QIODevice *data);
    ~MainWindow();

private slots:
    void on_btnDownload_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
Run Code Online (Sandbox Code Playgroud)

下载文件

#ifndef QDOWNLOADER_H
#define QDOWNLOADER_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>
#include <QStringList>
#include <QDir>
#include <QDebug>

class QDownloader : public QObject …
Run Code Online (Sandbox Code Playgroud)

c++ qt qnetworkaccessmanager

1
推荐指数
1
解决办法
1万
查看次数

如何使用 JSON 正文在 Qt 中发送 POST 请求

我正在尝试从 Qt 发送一个 POST 请求,其中正文为 JSON 格式。首先,我断言请求在 curl 中有效:

curl -i -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' -X POST http://myserver.com/api
Run Code Online (Sandbox Code Playgroud)

工作正常,我收到了来自服务器的预期响应。在 Python 中同样有效。现在我需要从 C++/Qt 发送这个请求:

QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
QHttpMultiPart *httpMultiPart = new QHttpMultiPart(mgr);
QHttpPart *httpPart = new QHttpPart();
httpPart->setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
httpPart->setBody("{\"key1\":\"value1\", \"key2\":\"value2\"}");

httpMultiPart->append(*httpPart);

QNetworkReply *reply = mgr->post(QNetworkRequest(QUrl("http://myserver.com/api")), httpMultiPart);
QObject::connect(reply, &QNetworkReply::finished, [=]()
        {
            QString err = reply->errorString();
            QString contents = QString::fromUtf8(reply->readAll());
        });
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误,其中 errorString 返回:`

"Error downloading http://myserver.com/api - server replied: Unsupported Media Type"`
Run Code Online (Sandbox Code Playgroud)

原因是什么?我应该如何像使用 curl 发送的那样发送 …

post qt json content-type qnetworkaccessmanager

1
推荐指数
1
解决办法
5628
查看次数

C++ Qt从QNetworkRequest获取HTTP头

我正在开发一个Qt C++应用程序.我需要下载一些文件(可能很大)并向用户显示下载进度.要执行此任务,我使用以下代码:

QNetworkAccessManager* networkManager = new QNetworkAccessManager();

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
QNetworkReply reply = networkManager->get(request);
QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
                 this, SLOT(downloadProgressChanged(qint64,qint64)));
Run Code Online (Sandbox Code Playgroud)

downloadProgressChanged带有此代码的插槽在哪里:

void downloadProgressChanged(qint64 downloaded, qint64 total)
{
    ui->progressBar->setValue(ui->progressBar->value() + 1);
    ui->labelProgress->setText(QString::number((downloaded / 1024)));
}
Run Code Online (Sandbox Code Playgroud)

(我使用QProgressBar命名progressBar显示进度,QLabel命名labelProgress显示下载的千字节).

我的问题是我无法访问Content-Length标头(int fileSize值为0),因此我无法显示操作的进度.我检查了我的网络服务器上的HTTP标头 - Content-Length工作正常.

这个SO问题中,我读到我可以使用QNetworkReply::metaDataChanged()信号,但我怎样才能用它来显示进度?文档说下载已经开始时可以发出信号,但我需要开始下载之前获取标题内容- 设置我的progressBar.

c++ qt qnetworkaccessmanager http-headers

0
推荐指数
1
解决办法
4559
查看次数