首页 文章

使用QWebEngineView捕获服务器响应

提问于
浏览
2

我正在尝试在Qt中创建一个Dialog加载一个URL(我不想向最终用户公开,因此是一个Dialog) . 用户在页面上输入凭据后,服务器将返回我想要捕获的重定向URL . 我怎样才能做到这一点?

QtWebkit使这很容易,因为QWebView有一个QNetworkAccessManager对象 . 但是使用QtWebEngine,QWebEngineView类没有此功能 . 前者还允许通过使用QNetworkRequest类为任何请求设置HTTP标头,然后在QWebView中加载具有这些特定请求的请求 . 如何使用QWebEngineView执行此操作?

1 回答

  • 6

    从Qt 5.6开始,针对 QWebEngineView 尝试实现的建议解决方案是QWebEngineUrlRequestInterceptor

    实现QWebEngineUrlRequestInterceptor接口并在配置文件上安装拦截器可以在URL请求到达Chromium的网络堆栈之前拦截,阻止和修改它们 .

    它是一个抽象类,这意味着您需要将其子类化以获得您想要的内容:

    #include <QWebEngineUrlRequestInterceptor>
    #include <QDebug>
    
    class RequestInterceptor : public QWebEngineUrlRequestInterceptor
    {
    public:
        explicit RequestInterceptor(QObject * parent = Q_NULLPTR) : QWebEngineUrlRequestInterceptor(parent) {}
        virtual void interceptRequest(QWebEngineUrlRequestInfo & info) Q_DECL_OVERRIDE;
    };
    
    void RequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo & info)
    {
        // Intercepting the requested URL
        QUrl url = info.requestUrl();
        qDebug() << "Request URL: " << url;
    
        // Optionally redirect the request URL but it only works for requests 
        // without payload data such as GET ones
        info.redirect(QUrl("https://www.google.com"));
    
        // Set HTTP header
        QByteArray httpHeaderName = "SomeHeaderName";
        QByteArray httpHeaderValue = "SomeHeaderValue";
        info.setHttpHeader(httpHeaderName, httpHeaderValue);
    }
    

    然后你需要在 QWebEngineProfile 中为特定的 QWebEnginePage 注册指向此拦截器的指针,如下所示:

    QWebEngineView * view = new QWebEngineView;
    RequestInterceptor * interceptor = new RequestInterceptor(view);
    QWebEngineProfile * profile = new QWebEngineProfile(view);
    profile->setRequestInterceptor(interceptor);
    QWebEnginePage * page = new QWebEnginePage(profile, view);
    view->setPage(page);
    

相关问题