使用 QWebEngineView 捕获服务器响应

Capture server response with QWebEngineView

我正在尝试在 Qt 中创建一个加载 URL 的对话框(我不想将其暴露给 end-user,因此是一个对话框)。一旦用户在页面上输入了他们的凭据,服务器 returns 重定向 URL 我想捕获。我该怎么做?

QtWebkit 使这很容易做到,因为 QWebView 有一个 QNetworkAccessManager object。但是对于 QtWebEngine,QWebEngineView class 没有这个能力。前者还允许通过使用 QNetworkRequest class 为任何请求设置 HTTP headers,然后在 QWebView 中使用这些特定请求加载请求。我如何使用 QWebEngineView 执行此操作?

自 Qt 5.6 起,针对您尝试使用 QWebEngineView 实现的目标,建议的解决方案是 QWebEngineUrlRequestInterceptor:

Implementing the QWebEngineUrlRequestInterceptor interface and installing the interceptor on the profile enables intercepting, blocking, and modifying URL requests before they reach the networking stack of Chromium.

它是一个抽象class,这意味着您需要对它进行子class以获得您想要的内容:

#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);