我有一个子类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
}
答案 0 :(得分:0)
事实证明,QNetworkReply
中需要一些额外的步骤,这些步骤未在任何地方记录。为了使它工作,我需要将以下内容添加到构造函数中:
setRequest(request);
setUrl(request.url());
setOperation(operation);
现在按预期工作。
你可以在这里看到一个例子: https://code.google.com/p/htmapp/source/browse/#hg%2Ffrwk%2Fqt