Как отправить POST-запрос в Qt с телом JSON - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь отправить запрос POST из Qt, где тело находится в формате JSON. Во-первых, я утверждаю, что запрос работает в curl:

curl -i -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' -X POST http://myserver.com/api

Это работает нормально, я получаю ожидаемый ответ от сервера. То же самое работает в Python. Теперь мне нужно отправить этот запрос из C ++ / Qt:

QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
QHttpMultiPart *httpMultiPart = new QHttpMultiPart(mgr);
QHttpPart *httpPart = new QHttpPart();
httpPart->setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
httpPart->setBody("{\"key1\":\"value1\", \"key2\":\"value2\"}");

httpMultiPart->append(*httpPart);

QNetworkReply *reply = mgr->post(QNetworkRequest(QUrl("http://myserver.com/api")), httpMultiPart);
QObject::connect(reply, &QNetworkReply::finished, [=]()
        {
            QString err = reply->errorString();
            QString contents = QString::fromUtf8(reply->readAll());
        });

Теперь я получаю ошибку, когда errorString возвращает: `

"Error downloading http://myserver.com/api - server replied: Unsupported Media Type"`

В чем может быть причина? Как я должен отправить запрос POST, как тот, который я отправляю с помощью curl?

1 Ответ

1 голос
/ 07 февраля 2020

QHttpMultiPart используется для отправки составного сообщения MIME, но в этом случае не требуется отправлять информацию такого типа. Вместо этого вы должны использовать QJsonDocument, чтобы создать json и преобразовать его в QByteArray:

QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
const QUrl url(QStringLiteral("http://myserver.com/api"));
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

QJsonObject obj;
obj["key1"] = "value1";
obj["key2"] = "value2";
QJsonDocument doc(obj);
QByteArray data = doc.toJson();
// or
// QByteArray data("{\"key1\":\"value1\",\"key2\":\"value2\"}");
QNetworkReply *reply = mgr->post(request, data);

QObject::connect(reply, &QNetworkReply::finished, [=](){
    if(reply->error() == QNetworkReply::NoError){
        QString contents = QString::fromUtf8(reply->readAll());
        qDebug() << contents;
    }
    else{
        QString err = reply->errorString();
        qDebug() << err;
    }
    reply->deleteLater();
});
...