自学内容网 自学内容网

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)!