我想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)
我刚刚设法使 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)
| 归档时间: |
|
| 查看次数: |
16773 次 |
| 最近记录: |