【问题标题】:QWebView loading page per GET request fails每个 GET 请求的 QWebView 加载页面失败
【发布时间】:2014-04-03 21:15:48
【问题描述】:

我正在尝试通过嵌入在 QWebView 中的 JavaScript 中的 GET 加载网站。如果我使用 jQuery.ajax 它会给我一个错误。解决办法是取XMLHttpRequest

这是我的 JavaScript 代码:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var data = jQuery.parseXML(xmlhttp.responseText);
        alert(data);
    } else if (xmlhttp.readyState == 4) {
        alert(JSON.stringify(xmlhttp));
    }
}

xmlhttp.open("GET", CO_SERVICE, true);
xmlhttp.setRequestHeader("Authorization", "Basic " + btoa("user:password"));
xmlhttp.send();

它在 Chrome 中运行良好。如果我执行我的 Qt 应用程序并加载文件:

QNetworkProxyFactory::setUseSystemConfiguration(true);

ui->webView->load(QUrl("qrc:///index.html"));
ui->webView->show();

我收到此错误:

我做错了什么?

【问题讨论】:

  • 这可能是alert(JSON.stringify(xmlhttp)); 调用产生的结果。因为您将 xmlhttp 对象字符串化。
  • @Jite 我知道这一点,但仍然存在一些错误。响应为空,并且它跳转到 else if 的事实证明发生了错误。
  • 好吧,如果它跳转到else,可能是因为脚本返回的状态不是200。我在json数据中看不到status属性,所以不确定是哪个,但也许您请求的页面不存在?
  • @Jite "status": 0。这可能是因为我的网络使用代理吗?但是我可以在位于内部服务器上的 JS 中加载依赖项。
  • 查看此答案以获取有关状态码 0 的信息:*.com/a/12622082/1980359。代理可能是一个问题并非不可能,您可以在没有代理的情况下尝试脚本,看看是否有效?

标签: javascript c++ ajax qt qwebview


【解决方案1】:

这是我的解决方案,对我有用:

JavaScript

this.done = function (value) {
    console.log(value);
};

getRequest.done.connect(this, done);
getRequest.get("url", "username", "password");

C++

MainWindow.h

private:
    Ui::MainWindow *ui;
    GetRequest* mGetRequest;

private slots:
    void addJSObject();

MainWindow.cpp

mGetRequest = new GetRequest();

QObject::connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addJSObject()));

ui->webView->load(QUrl("qrc:/index.html"));


void MainWindow::addJSObject() {
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject(QString("getRequest"), mGetRequest);
}

GetRequest.h

#ifndef GETREQUEST_H
#define GETREQUEST_H

#include <QObject>
#include <QString>

#include <QNetworkReply>
#include <QNetworkAccessManager>

class GetRequest : public QObject {
    Q_OBJECT

public:
    explicit GetRequest(QObject *parent = 0);
    ~GetRequest();

public slots:
    void get(QString url, QString username, QString password);

signals:
    void done(QString value);

private:
    QNetworkAccessManager* mNetworkAccessManager;

private slots:
    void replyFinished(QNetworkReply* networkReply);
};

#endif // GETREQUEST_H

GetRequest.m

#include "getrequest.h"

GetRequest::GetRequest(QObject *parent) : QObject(parent) {
    mNetworkAccessManager = new QNetworkAccessManager(this);
    QObject::connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}

GetRequest::~GetRequest() {
    delete mNetworkAccessManager;
}

void GetRequest::get(QString url, QString username, QString password) {
    QUrl u(url);
    u.setUserName(username);
    u.setPassword(password);

    mNetworkAccessManager->get(QNetworkRequest(u));
}

void GetRequest::replyFinished(QNetworkReply* networkReply) {
    QString value(networkReply->readAll());

    emit done(value);

    delete networkReply;
}

【讨论】:

    最近更新 更多