2014-10-30 71 views
0

为了处理来自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 
} 

回答

0

所以它事实证明QNetworkReply需要一些额外的步骤,这些步骤在任何地方都没有记录。得到它的工作,我需要添加以下的构造:

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

这现在将按预期。

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