#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(«сообщения»);*****