如何编写Qt HTTP GET请求

How do I write a Qt HTTP GET request?

本文关键字:GET 请求 HTTP Qt 何编写      更新时间:2023-10-16

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

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

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

{"key1": "value1", "key2": "**value2**", "key3": "value3"}

这是我的调试代码:

char value[20]
value = <**value2**>

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

你需要三样东西:

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

有关更多详细信息:

  • http://doc.qt.io/qt-5/qnetworkaccessmanager.html#details

  • http://doc.qt.io/qt-5/qnetworkrequest.html#details

  • http://doc.qt.io/qt-5/qnetworkreply.html#details

例如:

。.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;
}

.h 文件

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *manager;
    QNetworkRequest request;

编辑 LAMBDA 插槽:如果不使用 lambda 信号插槽。

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

private slots:
    void managerFinished(QNetworkReply *reply);

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

QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
    this, SLOT(managerFinished(QNetworkReply*)));

现在在您的插槽中:

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

我只是设法让HTTP请求工作。

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

主.cpp

#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();
}

主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;
};

要使用 CMakeLinux 上编译它,请使用以下 CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(http)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_AUTOMOC ON) # important
add_executable(${PROJECT_NAME} main.cpp main.h)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Network REQUIRED) # important
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Network) # important