如何编写Qt HTTP GET请求?

Ale*_*o95 7 c++ qt

我想GET用C++ 编写一个小的HTTP 请求,但我找不到解决方案.

也许我必须使用QNetworkAccessManager类,但我不是C++方面的专家,而且很难理解这门课程.

我有一个获取的URL,它会给我一个JSON响应; 我必须提取一个键(key2)并将值放在一个变量中.这是一个例子:

{"key1": "value1", "key2": "**value2**", "key3": "value3"}
Run Code Online (Sandbox Code Playgroud)

这是我的调试代码:

char value[20]
value = <**value2**>
Run Code Online (Sandbox Code Playgroud)

在此之后,我必须以.ui形式打印此值

Taz*_*dze 19

你需要三件事.

  • QNetworkAccessManager * manager; - >向我们发送请求.
  • QNetworkRequest request; - >什么类型的需求?得到,发布,......
  • QNetworkReply. - >答案是什么?

更多细节:

例如:

的.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    manager = new QNetworkAccessManager();
    QObject::connect(manager, &QNetworkAccessManager::finished,
        this, [=](QNetworkReply *reply) {
            if (reply->error()) {
                qDebug() << reply->errorString();
                return;
            }

            QString answer = reply->readAll();

            qDebug() << answer;
        }
    );
}

void MainWindow::on_pushButton_clicked()
{
    request.setUrl(QUrl("http://url"));
    manager->get(request);
}

MainWindow::~MainWindow()
{
    delete ui;
    delete manager;
}
Run Code Online (Sandbox Code Playgroud)

.h文件

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *manager;
    QNetworkRequest request;
Run Code Online (Sandbox Code Playgroud)

EDIT LAMBDA SLOT: 如果不使用lambda SIGNAL SLOT.

例如,在.h文件中描述一个插槽:

private slots:
    void managerFinished(QNetworkReply *reply);
Run Code Online (Sandbox Code Playgroud)

在.cpp构造函数中将lambda替换为

QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
    this, SLOT(managerFinished(QNetworkReply*)));
Run Code Online (Sandbox Code Playgroud)

现在在你的插槽中:

void MainWindow::managerFinished(QNetworkReply *reply) {
    if (reply->error()) {
        qDebug() << reply->errorString();
        return;
    }

    QString answer = reply->readAll();

    qDebug() << answer;
}
Run Code Online (Sandbox Code Playgroud)


Blu*_*nCZ 7

我刚刚设法使 HTTP 请求正常工作。

此示例只是下载 google HTML 页面并将其内容打印到终端。

主程序

#include <iostream>
#include "main.h"

MyObject::MyObject(QApplication* app) {
    manager = new QNetworkAccessManager(app);
}

void MyObject::TestConnection() const {
auto status = connect(manager, &QNetworkAccessManager::finished,
                      this, &MyObject::ReplyFinished);
    qDebug() << "Connection status:" << status;

    manager->get(QNetworkRequest(QUrl("https://www.google.com")));
}

void MyObject::ReplyFinished(QNetworkReply *reply) {
    QString answer = reply->readAll();
    qDebug() << answer;
    QApplication::quit();
}

int main(int argc, char *argv[]) {
    auto *app = new QApplication(argc, argv);
    auto myObject = new MyObject(app);
    myObject->TestConnection();
    return QApplication::exec();
}
Run Code Online (Sandbox Code Playgroud)

主程序.h

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QApplication>

class MyObject : public QObject {
Q_OBJECT
public:
    explicit MyObject(QApplication* application);
    void TestConnection() const;
    static void ReplyFinished(QNetworkReply *reply);

    QNetworkAccessManager *manager;
};
Run Code Online (Sandbox Code Playgroud)

要使用 CMake 在 Linux 上编译此文件,使用以下CMakeLists.txt

#include <iostream>
#include "main.h"

MyObject::MyObject(QApplication* app) {
    manager = new QNetworkAccessManager(app);
}

void MyObject::TestConnection() const {
auto status = connect(manager, &QNetworkAccessManager::finished,
                      this, &MyObject::ReplyFinished);
    qDebug() << "Connection status:" << status;

    manager->get(QNetworkRequest(QUrl("https://www.google.com")));
}

void MyObject::ReplyFinished(QNetworkReply *reply) {
    QString answer = reply->readAll();
    qDebug() << answer;
    QApplication::quit();
}

int main(int argc, char *argv[]) {
    auto *app = new QApplication(argc, argv);
    auto myObject = new MyObject(app);
    myObject->TestConnection();
    return QApplication::exec();
}
Run Code Online (Sandbox Code Playgroud)