我正在开发一个项目,我正在尝试通过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' …
我正在尝试编写一个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/控制台类型的应用程序是否有等价物?
我正在尝试使这个问题中的代码起作用。 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) 我正在尝试从 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 发送的那样发送 …
我正在开发一个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.