qt QNetworkAccessManager详解
1、概述
QNetworkAccessManager是QtNetwork模块中的一个核心类,它允许应用程序发送网络请求并接收响应。该类是网络通信的基石,提供了一种方便的方式来处理常见的网络协议,如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用配置和设置,包括代理、缓存配置等,并且包含了与此类问题相关的信号,以及可用于监视网络操作进展的回复信号。
2、重要方法
QNetworkAccessManager类提供了多种方法来发送网络请求,其中最常用的包括:
- get():发送一个GET请求到指定的URL。
- post():发送一个POST请求到指定的URL,并附带请求数据。
- put()、upload()等:用于执行更复杂的网络操作,如文件上传等。
此外,QNetworkAccessManager还提供了一些其他方法,如设置代理、处理重定向、处理身份验证等,以满足不同的网络需求。
3、重要信号
QNetworkAccessManager类定义了多个信号,用于通知应用程序网络操作的进展和结果。其中一些重要的信号包括:
- finished(QNetworkReply*):当网络请求完成时触发此信号。QNetworkReply对象包含了下载的数据以及元数据(如头部信息)。
- readyRead():当QNetworkReply对象中有新的数据可读时触发此信号。这允许应用程序在数据到达时逐步读取,而不是等待整个响应完成。
- error(QNetworkReply::NetworkError):当网络请求出现错误时触发此信号。QNetworkReply::NetworkError枚举类型指定了错误的类型。
此外,QNetworkReply对象还定义了其他信号,如sslErrors()、uploadProgress()、downloadProgress()等,用于提供关于SSL错误、上传进度和下载进度的信息。
4、常用枚举类型
QNetworkAccessManager和QNetworkReply类定义了一些枚举类型,用于表示网络操作的状态和结果。以下是一些常用的枚举类型:
- QNetworkAccessManager::NetworkAccessibility:表示网络是否可以通过该网络访问管理器访问。它用于检测应用程序的网络访问状态。
- QNetworkAccessManager::Operation:表示QNetworkReply对象正在处理的操作类型,如GET、POST等。
- QNetworkReply::NetworkError:表示在处理网络请求过程中可能出现的错误类型。
这些枚举类型提供了丰富的信息,帮助应用程序更好地处理网络请求和响应。
//模拟服务端
from flask import Flask, request, jsonify
app = Flask(__name__)
# 模拟一个数据库,用字典存储数据
data_store = {}
# GET 请求: 获取数据
@app.route('/data/<int:item_id>', methods=['GET'])
def get_data(item_id):
item = data_store.get(item_id)
if item:
return jsonify(item), 200
return jsonify({"message": "Item not found"}), 404
# POST 请求: 创建数据
@app.route('/data', methods=['POST'])
def create_data():
# 从请求体中获取 JSON 数据
new_item = request.get_json()
item_id = new_item.get('id')
if not item_id:
return jsonify({"message": "ID is required"}), 400
# 如果 ID 已存在,返回错误
if item_id in data_store:
return jsonify({"message": "Item with this ID already exists"}), 400
# 保存数据到“数据库”
data_store[item_id] = new_item
return jsonify(new_item), 201
# PUT 请求: 修改数据
@app.route('/data/<int:item_id>', methods=['PUT'])
def update_data(item_id):
# 从请求体中获取 JSON 数据
updated_item = request.get_json()
if item_id not in data_store:
return jsonify({"message": "Item not found"}), 404
# 更新数据
data_store[item_id] = updated_item
return jsonify(updated_item), 200
# DELETE 请求: 删除数据
@app.route('/data/<int:item_id>', methods=['DELETE'])
def delete_data(item_id):
if item_id in data_store:
del data_store[item_id]
return jsonify({"message": "Item deleted"}), 200
return jsonify({"message": "Item not found"}), 404
if __name__ == '__main__':
app.run(debug=True)
客户端:
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QTextEdit>
#include <QLineEdit>
#include <QLabel>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
class HttpClient : public QWidget {
Q_OBJECT
public:
HttpClient(QWidget *parent = nullptr) : QWidget(parent) {
initUI();
manager = new QNetworkAccessManager(this);
}
private slots:
void getData() {
QString itemId = idInput->text();
QNetworkRequest request(QUrl("http://127.0.0.1:5000/data/" + itemId));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this, [=]() {
responseLabel->setText("Response: " + reply->readAll());
reply->deleteLater();
});
}
void createData() {
QString itemData = dataInput->toPlainText();
QNetworkRequest request(QUrl("http://127.0.0.1:5000/data"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = manager->post(request, itemData.toUtf8());
connect(reply, &QNetworkReply::finished, this, [=]() {
responseLabel->setText("Response: " + reply->readAll());
reply->deleteLater();
});
}
void updateData() {
QString itemId = idInput->text();
QString itemData = dataInput->toPlainText();
QNetworkRequest request(QUrl("http://127.0.0.1:5000/data/" + itemId));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = manager->put(request, itemData.toUtf8());
connect(reply, &QNetworkReply::finished, this, [=]() {
responseLabel->setText("Response: " + reply->readAll());
reply->deleteLater();
});
}
void deleteData() {
QString itemId = idInput->text();
QNetworkRequest request(QUrl("http://127.0.0.1:5000/data/" + itemId));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = manager->deleteResource(request);
connect(reply, &QNetworkReply::finished, this, [=]() {
responseLabel->setText("Response: " + reply->readAll());
reply->deleteLater();
});
}
private:
void initUI() {
setWindowTitle("HTTP Client");
QVBoxLayout *layout = new QVBoxLayout(this);
idInput = new QLineEdit(this);
idInput->setPlaceholderText("Enter Item ID");
layout->addWidget(idInput);
dataInput = new QTextEdit(this);
dataInput->setPlaceholderText("Enter JSON data (for POST/PUT)");
layout->addWidget(dataInput);
responseLabel = new QLabel("Response:", this);
layout->addWidget(responseLabel);
QPushButton *getButton = new QPushButton("GET", this);
connect(getButton, &QPushButton::clicked, this, &HttpClient::getData);
layout->addWidget(getButton);
QPushButton *postButton = new QPushButton("POST", this);
connect(postButton, &QPushButton::clicked, this, &HttpClient::createData);
layout->addWidget(postButton);
QPushButton *putButton = new QPushButton("PUT", this);
connect(putButton, &QPushButton::clicked, this, &HttpClient::updateData);
layout->addWidget(putButton);
QPushButton *deleteButton = new QPushButton("DELETE", this);
connect(deleteButton, &QPushButton::clicked, this, &HttpClient::deleteData);
layout->addWidget(deleteButton);
setLayout(layout);
}
QLineEdit *idInput;
QTextEdit *dataInput;
QLabel *responseLabel;
QNetworkAccessManager *manager;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
HttpClient client;
client.show();
return app.exec();
}
觉得有帮助的话,打赏一下呗。。
需要商务合作(定制程序)的欢迎私信!!
原文地址:https://blog.csdn.net/ckg3824278/article/details/144272755
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!