HTTP-запрос на C для BlackBerry 10

#c #qt #http #get #blackberry-10

#c #qt #http #получить #blackberry-10

Вопрос:

С этой веб-страницы у меня есть код.

Когда я использую "http://httpbin.org/get" , все в порядке.

Но когда я использую свой собственный URL, например "http://my-json-server.typicode.com/typicode/demo/db" , я получаю сообщение об ошибке:

Не удается получить заголовки запроса

В чем моя вина?

 void RequestHeaders::getRequest()
{
    //const QUrl url("http://httpbin.org/get"); // OK
    const QUrl url("http://my-json-server.typicode.com/typicode/demo/db"); // Not OK

    QNetworkRequest request(url);

    QNetworkReply* reply = m_networkAccessManager->get(request);
    bool ok = connect(reply, SIGNAL(finished()), this, SLOT(onGetReply()));
    Q_ASSERT(ok);
    Q_UNUSED(ok);
}

void RequestHeaders::onGetReply()
{
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());

    QString response;
    const QByteArray buffer(reply->readAll());

    bb::data::JsonDataAccess ja;
    const QVariant jsonva = ja.loadFromBuffer(buffer);
    const QMap<QString, QVariant> jsonreply = jsonva.toMap();

    QMap<QString, QVariant>::const_iterator it = jsonreply.find("headers");
    if (it != jsonreply.end()) {

        const QMap<QString, QVariant> headers = it.value().toMap();
        for (QMap<QString, QVariant>::const_iterator hdrIter = headers.begin();
            hdrIter != headers.end();   hdrIter) {
            if (hdrIter.value().toString().trimmed().isEmpty())
                continue;

            response  = QString::fromLatin1("%1: %2rn").arg(hdrIter.key(),
            hdrIter.value().toString());
        }
    }

    for (it = jsonreply.begin(); it != jsonreply.end(); it  ) {
        if (it.value().toString().trimmed().isEmpty())
            continue;

        response  = QString::fromLatin1("%1: %2rn").arg(it.key(), it.value().toString());
    }

    reply->deleteLater();

    if (response.trimmed().isEmpty()) {
        response = tr("Unable to retrieve request headers");
    }

    emit complete(response);
}
 

Ответ №1:

Ваш onGetReply обработчик анализирует тело HTTP-ответа сервера в формате JSON, ищет в нем "headers" дочернее поле и, если найдено, затем извлекает собственные дочерние поля этого дочернего элемента в локальную response переменную.

http://httpbin.org/get отвечает объектом JSON, содержащим "headers" дочерний объект, в котором есть дочерние поля. Таким образом, ваша response переменная в конечном итоге не будет пустой.

http://my-json-server.typicode.com/typicode/demo/db отвечает объектом JSON, который не содержит "headers" дочерних элементов. Таким образом, ваша response переменная остается пустой.

Вам нужно либо:

  • исправьте, чтобы ваш сервер отвечал JSON, который фактически соответствует ожидаемому вашему коду.
  • исправьте свой onGetReply() код для обработки JSON, который фактически отправляет ваш сервер.

Комментарии:

1. Здравствуйте, спасибо за ваш ответ. Когда я пытаюсь изменить «заголовки» на «сообщения» или «комментарии» или «профиль», я получаю то же сообщение об ошибке:( ***** QMap<QString, QVariant>::const_iterator it = jsonreply.find(«сообщения»);*****