将标头添加到QNetworkReply

时间:2014-10-30 18:31:35

标签: javascript html c++ ajax qt

我有一个子类QNetworkAccessManager和QNetworkReply,以便处理来自JavaScript应用程序的自定义AJAX请求。它主要起作用,除了我的网络回复似乎被剥夺了任何标题。

我可以验证NetworkReply返回的QNetworkAccessManager::createRequest是否已正确设置标头,但我无法从JavaScript访问它。请考虑以下代码:

在JavaScript中:

var xhr = new XMLHttpRequest();

xhr.open("POST", "test.php"); // fake url
xhr.responseType = "json";   
xhr.setRequestHeader("Test-Header", "42");   

xhr.onload = onXHRLoad;

xhr.send();

然后在QNetworkAccessManager内检索,然后用于创建新的QNetworkReply,如下所示:

NetworkReply *NetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
{
    if( request.url().host() == "test" )
    {
        NetworkReply* nr = new NetworkReply(request, outgoingData);

        if (nr->hasRawHeader("Test-Header"))
        {
            qDebug() << "[Qt] Sending Network Reply with Test-Header value: " << nr->rawHeader("Test-Header");
        }

        return nr;
    }

    return QNetworkAccessManager::createRequest(op, request, outgoingData);
}

NetworkReply内部构造函数中,我从请求中检索标头值并将其设置为回复:

if (request.hasRawHeader("Test-Header"))
{        
    this->setRawHeader("Test-Header", request.rawHeader("Test-Header"));
}

我可以验证此值是否设置正确并且新创建的回复确实存在标题,但是当JavaScripts收到响应时标题不存在(而数据是):

function onXHRLoad(event) {
    var header = event.target.getResponseHeader("Test-Header"); // <- null
}

1 个答案:

答案 0 :(得分:0)

事实证明,QNetworkReply中需要一些额外的步骤,这些步骤未在任何地方记录。为了使它工作,我需要将以下内容添加到构造函数中:

setRequest(request);
setUrl(request.url());
setOperation(operation);

现在按预期工作。

你可以在这里看到一个例子: https://code.google.com/p/htmapp/source/browse/#hg%2Ffrwk%2Fqt