插件窝 干货文章 如何用QWebEngineView解析网页请求中的JSON数据?

如何用QWebEngineView解析网页请求中的JSON数据?

请求 QWebEngineUrlReq uestInterceptor 拦截 496    来源:    2025-03-11

在使用 QWebEngineView 解析网页请求中的 JSON 数据时,通常需要拦截网络请求并提取其中的 JSON 数据。QWebEngineView 是 Qt 提供的一个用于显示网页内容的组件,但它本身并不直接提供拦截和解析网络请求的功能。为了实现这个功能,你可以使用 QWebEngineProfileQWebEngineUrlRequestInterceptor 来拦截网络请求,并解析其中的 JSON 数据。

以下是一个简单的示例,展示如何使用 QWebEngineViewQWebEngineUrlRequestInterceptor 来拦截并解析网页请求中的 JSON 数据:

  1. 创建自定义的 QWebEngineUrlRequestInterceptor: 你需要创建一个自定义的 QWebEngineUrlRequestInterceptor 来拦截网络请求,并提取其中的 JSON 数据。
#include <QWebEngineUrlRequestInterceptor>
#include <QNetworkRequest>
#include <QByteArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>

class MyRequestInterceptor : public QWebEngineUrlRequestInterceptor
{
    Q_OBJECT

public:
    explicit MyRequestInterceptor(QObject *parent = nullptr) : QWebEngineUrlRequestInterceptor(parent) {}

    void interceptRequest(QWebEngineUrlRequestInfo &info) override
    {
        // 检查请求的 URL 或其他条件
        if (info.requestUrl().toString().contains("api/data")) {
            // 获取请求的 body 数据
            QByteArray requestBody = info.requestBody();
            if (!requestBody.isEmpty()) {
                // 解析 JSON 数据
                QJsonDocument jsonDoc = QJsonDocument::fromJson(requestBody);
                if (!jsonDoc.isNull()) {
                    QJsonObject jsonObj = jsonDoc.object();
                    qDebug() << "Parsed JSON data:" << jsonObj;
                }
            }
        }
    }
};
  1. 设置 QWebEngineProfile 并使用自定义的 QWebEngineUrlRequestInterceptor: 你需要将自定义的 QWebEngineUrlRequestInterceptor 设置到 QWebEngineProfile 中,并将其应用到 QWebEngineView
#include <QApplication>
#include <QWebEngineView>
#include <QWebEngineProfile>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWebEngineView view;

    // 创建自定义的请求拦截器
    MyRequestInterceptor *interceptor = new MyRequestInterceptor(&view);

    // 获取默认的 QWebEngineProfile 并设置拦截器
    QWebEngineProfile *profile = QWebEngineProfile::defaultProfile();
    profile->setUrlRequestInterceptor(interceptor);

    // 加载网页
    view.setUrl(QUrl("https://example.com"));
    view.show();

    return app.exec();
}
  1. 运行程序并观察输出: 当你运行这个程序时,MyRequestInterceptor 会拦截所有网络请求,并检查请求的 URL 是否包含 "api/data"。如果包含,它会尝试解析请求体中的 JSON 数据,并将其打印到调试输出中。

注意事项:

  • QWebEngineUrlRequestInterceptor 只能拦截请求的 URL 和请求头,无法直接获取请求体。如果你需要获取请求体,可能需要使用其他方法,例如通过 JavaScript 注入来捕获请求体。
  • 如果你需要拦截 HTTPS 请求,可能需要处理 SSL 证书问题。
  • 这种方法适用于简单的场景,如果需要更复杂的请求处理,可能需要结合其他工具或库来实现。

通过这种方式,你可以在 QWebEngineView 中拦截并解析网页请求中的 JSON 数据。