使用QWebEngineView捕获服务器响应

f1z*_*_13 2 qt qtwebkit qwebview qtwebengine

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

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

Dmi*_*try 6

从Qt 5.6开始,针对您要实现的目标的解决方案QWebEngineViewQWebEngineUrlRequestInterceptor:

实现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);
}
Run Code Online (Sandbox Code Playgroud)

然后,你需要指针寄存器该拦截器在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);
Run Code Online (Sandbox Code Playgroud)

  • 如何获取响应体? (2认同)