向QNetworkReply添加HTML标头
问题描述:
为了处理来自JavaScript应用程序的自定义AJAX请求,我有一个子类QNetworkAccessManager和QNetworkReply。它主要工作,除了似乎我的网络回复被剥夺任何头。向QNetworkReply添加HTML标头
我可以验证QNetworkAccessManager::createRequest
返回的NetworkReply
的标头设置是否正确,但是我无法从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"));
}
我可以验证该值被正确地设置和新创建的应答确实有报头存在,但是,当JavaScript的接收响应的报头不存在(当数据):
function onXHRLoad(event) {
var header = event.target.getResponseHeader("Test-Header"); // <- null
}
答
所以它事实证明QNetworkReply
需要一些额外的步骤,这些步骤在任何地方都没有记录。得到它的工作,我需要添加以下的构造:
setRequest(request);
setUrl(request.url());
setOperation(operation);
这现在将按预期。
你可以在这里看到一个例子: https://code.google.com/p/htmapp/source/browse/#hg%2Ffrwk%2Fqt