Russian Qt Forum

Qt => Работа с сетью => Тема начата: maks1596 от Январь 29, 2018, 17:19



Название: Пустое тело в PATCH запросе
Отправлено: maks1596 от Январь 29, 2018, 17:19
При отправлении PATCH-запроса через QNetworkAccessManager::sendCustomRequest(...) на сервере возникает внутренняя ошибка из-за того, что тело запроса приходит пустое.
Сам JSON не пустой. Пустое тело перехватил через Postman.

Код:
QNetworkReply *Requester::sendCustomRequest(QNetworkRequest &request,
                                            const QString &type,
                                            const QJsonObject &json) {
    request.setRawHeader("HTTP", type.toUtf8());
    QByteArray dataByteArray = jsonToByteArray(json);

    QBuffer *buff = new QBuffer();
    buff->open(QIODevice::ReadWrite);
    buff->write(dataByteArray);
    buff->seek(0);

    QNetworkReply* reply = pimpl->networkAccessManager
                                 .sendCustomRequest(request, type.toUtf8(), buff);
    buff->setParent(reply);
    return reply;
}

inline
QByteArray jsonToByteArray(const QJsonObject &json) {
    return QJsonDocument(json).toJson();
}


Название: Re: Пустое тело в PATCH запросе
Отправлено: kambala от Январь 30, 2018, 00:57
я так отправляю PATCH-запрос, все работает:
Код
C++ (Qt)
auto buf = new QBuffer;
buf->buffer() = data; // QByteArray
auto deleteBufLambda = [buf]{ delete buf; };
 
if (buf->open(QIODevice::ReadOnly))
{
   auto reply = _qnam->sendCustomRequest(request, "PATCH", buf);
   connect(reply, &QNetworkReply::finished, [deleteBufLambda]{
       deleteBufLambda();
   });
}
else
   deleteBufLambda();


Название: Re: Пустое тело в PATCH запросе
Отправлено: Old от Январь 30, 2018, 01:58
Камрады, есть вариант метода sendCustomRequest, который в качестве данных принимает QByteArray. Зачем эти движения с QBuffer?


Название: Re: Пустое тело в PATCH запросе
Отправлено: maks1596 от Январь 30, 2018, 15:39
Камрады, есть вариант метода sendCustomRequest, который в качестве данных принимает QByteArray. Зачем эти движения с QBuffer?

Затем, что данная перегрузка появилась только в Qt 5.8, а у меня версия на единичку не дотягивающая до сей фичи. Нужно же, чтобы работало на древних компах с XP, которая выше 5.7 не воспринимает.


Название: Re: Пустое тело в PATCH запросе
Отправлено: maks1596 от Январь 30, 2018, 18:43
я так отправляю PATCH-запрос, все работает.

Вы правы. Всё действительно работает. Оставлю тут компиляцию из моего и Вашего рабочего кода.
Код
C++ (Qt)
QNetworkReply* sendCustomRequest(QNetworkRequest &request,
                                const QString &type,
                                const QJsonObject &json) {
   auto buffer = new QBuffer;
   buffer->buffer() = jsonToByteArray(json);
   QNetworkReply *reply;
 
   if (buffer->open(QIODevice::ReadOnly)) {
       reply = pimpl->networkAccessManager
                    .sendCustomRequest(request, type.toUtf8(), buffer);
       connect(reply, &QNetworkReply::finished,
               buffer, &QBuffer::deleteLater);
   } else {
       buffer->deleteLater();
   }
   return reply;
}
 
inline
QByteArray jsonToByteArray(const QJsonObject &json) {
   return QJsonDocument(json).toJson();
}
 


Название: Re: Пустое тело в PATCH запросе
Отправлено: kambala от Январь 31, 2018, 03:29
Камрады, есть вариант метода sendCustomRequest, который в качестве данных принимает QByteArray. Зачем эти движения с QBuffer?
а я под 5.6 писал :)