如何从 Qt QWebEngineView 获取 HTTP 状态码?

Posted

技术标签:

【中文标题】如何从 Qt QWebEngineView 获取 HTTP 状态码?【英文标题】:How To Get HTTP Status Codes From Qt QWebEngineView? 【发布时间】:2018-08-02 14:29:35 【问题描述】:

我一直在查看 QT 文档以找到一种在加载页面并发出请求后从 QWebEngineView 返回 http 状态代码的方法。我知道 QWebEngineView 不与 QNetWorkAccessManager 交互,这将使这变得轻而易举。那么有没有其他方法可以从使用 QWebEngineView 的请求中获取 HTTP 状态代码?我尝试了多种方法,包括 RequestInterceptor。下面是我尝试使用 RequestInterceptor 的 sn-p,但它没有给我实际的 HTTP 状态代码,只是常量值,这是我不想要的。

 /*************requestinterceptor.h**************/
#ifndef REQUESTINTERCEPTOR_H
#define REQUESTINTERCEPTOR_H

#include <QWebEngineUrlRequestInterceptor>
#include <QWebEngineUrlRequestInfo>
#include <QDebug>
#include <QUrl>

class RequestInterceptor : public QWebEngineUrlRequestInterceptor

      public:
      explicit RequestInterceptor(QObject * parent = Q_NULLPTR);
       virtual void interceptRequest(QWebEngineUrlRequestInfo & info) Q_DECL_OVERRIDE;
;
  #endif // REQUESTINTERCEPTOR_H

/*************requestinterceptor.cpp***************/

  #include "requestinterceptor.h"

  RequestInterceptor::RequestInterceptor(QObject * parent)
 :QWebEngineUrlRequestInterceptor(parent)

 void RequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo & info)
  
  QString rsrct = "";
 switch(info.resourceType())
  
      case 1:rsrct="ResourceTypeSubFrame, --> frame or iframe";break;
      case 2:rsrct="ResourceTypeStylesheet, --> a CSS stylesheet";break;
      case 3:rsrct="ResourceTypeScript, --> an external script";break;
      case 4:rsrct="ResourceTypeImage, --> an image (jpg/gif/png/etc)";break;
      case 5:rsrct="ResourceTypeFontResource, --> a font";break;
      case 6:rsrct="ResourceTypeSubResource, --> an other subresource.";break;
      case 7:rsrct="ResourceTypeObject, --> an object (or embed) tag for a plugin,";break;
      case 8:rsrct="ResourceTypeMedia, --> a media resource.";break;
      case 9:rsrct="ResourceTypeWorker, --> the main resource of a dedicated worker.";break;
      case 10:rsrct="ResourceTypeSharedWorker, --> the main resource of a shared worker.";break;
      case 11:rsrct="ResourceTypePrefetch, --> an explicitly requested prefetch";break;
      case 12:rsrct="ResourceTypeFavicon, --> a favicon";break;
      case 13:rsrct="ResourceTypeXhr, --> a XMLHttpRequest";break;
      case 14:rsrct="ResourceTypePing, --> a ping request for <a ping>";break;
      case 15:rsrct="ResourceTypeServiceWorker, --> the main resource of a service worker.";break;
  case 16:rsrct="ResourceTypeUnknown";break;

  default : rsrct="Unknown type";break;


qDebug()<<"\t"<<Q_FUNC_INFO<<":\n\t\t" << 
"WebUrlRequestInterceptor::interceptRequest    " <<info.requestMethod()
   <<"\r\n  "<<info.requestUrl()<<"   "<<rsrct      <<"\r\n";



  /*************mainwindow.cpp***************/
 const QUrl url("http://google.com");
 view = new WebView();
 view = new QWebEngineView();
 interceptor = new RequestInterceptor(view);
 profile = new QWebEngineProfile(view);
 profile->setRequestInterceptor(interceptor);
 page = new QWebEnginePage(profile,view);
 view->setPage(page);

【问题讨论】:

这对我来说似乎很奇怪,但在 C++ 中似乎没有解决方案,因为您可以检查源代码:code.qt.io/cgit/qt/qtwebengine.git/tree/src/webenginewidgets/…,但在 QML 方面它已启用,您可以使用信号 loadingChanged: doc.qt.io/qt-5/… 返回一个包含该信息的 WebEngineLoadRequest。 @eyllanesc,只是好奇,通常 HTTP 代码直接来自响应标头中的服务器响应。那么有没有办法从 html 源代码中的标头中获取这些响应代码..??? 如果您发出直接请求,则处理它,但在 QtWebEngine 的情况下,他发送这些请求并接收它们。 加:HTML 只是答案的一部分,标题不是 HTML 的一部分。 @eyllanesc,谢谢。 WebEngine QML 看起来像是我可能需要更改的东西,因为 QWebEngine 没有给我任何 http 状态代码。我希望从 QTWebEngine 移植到 WebEngine QML 非常相似,因为我的桌面应用程序正在使用 QTWebEngine。 【参考方案1】:

经过几个小时的搜索,我发现目前无法通过 QWebEngine 获取 HTTP 状态代码。加载完成事件也不返回任何状态码

然后我找到了解决办法

setting = webpage.settings()
setting.setAttribute(QWebEngineSettings.ErrorPageEnabled, False)

【讨论】:

你能补充一些细节吗?

以上是关于如何从 Qt QWebEngineView 获取 HTTP 状态码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从qwebengineview qt5.9中提取数据

如何从 QWebEngineView 打印

qwebengineview如何让js调用qt中的方法

qt.webChannelTransport 在 QWebEngineView 中未定义

QWebEngineView 触摸滚动

Qt 5.7 - QWebEngineView - 将 HTML 按钮单击事件连接到 C++/Qt 插槽