2014-10-30 3 views
0

У меня есть подклассы QNetworkAccessManager и QNetworkReply, чтобы обрабатывать пользовательские запросы AJAX из приложения JavaScript. В основном это работает, за исключением того, что мои сетевые ответы лишены любых заголовков.Добавление заголовка HTML в QNetworkReply

Я могу проверить, что 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

Так это оказывается, есть дополнительные шаги, необходимые в QNetworkReply, которые нигде не задокументированы. Чтобы получить его работу, мне нужно было добавить следующее к конструктору:

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

Это теперь работает так, как ожидалось.

Здесь вы можете увидеть пример: https://code.google.com/p/htmapp/source/browse/#hg%2Ffrwk%2Fqt

Смежные вопросы