Estoy usando el siguiente código para realizar una solicitud http:

QNetworkReply* ApiRequest::req(QString url, QString method, QByteArray data) {
    QByteArray request_method = method.toUtf8();
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    QNetworkRequest request("http://127.0.0.1:9090" + url);
    request.setRawHeader("Content-Type", "application/json");
    QNetworkReply* reply = manager->sendCustomRequest(request, request_method, data);
    return reply;
}

void ApiRequest::requestConfig()
{
    NetworkReply* reply = req("/configs",
        "GET",
        "");
}

El servidor remoto ejecutó la solicitud y respondió un código 204.
He utilizado wireshark para capturar y asegurarme de que haya respondido un 204 No Content.
Sin embargo, la salida es QVariant(Invalid), la salida toInt es 0.
Intenté cambiar PUT a GET pero aún no funciona.

2
Coel 16 oct. 2019 a las 02:38

1 respuesta

La mejor respuesta

Estás analizando el estado incluso cuando no se ha realizado la solicitud por lo que es válido que el resultado sea nulo, lo que debes hacer es analizarlo cuando se emite la señal terminada:

QNetworkReply* reply = mg->sendCustomRequest(request, "PUT", "....some json....");
connec(reply, &QNetworkReply::finished, [reply](){
    qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
});

Actualizar:

connec(mg, &QNetworkAccessManager::finished, [](QNetworkReply *reply){
    qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
});

Actualización 2:

¿Hay alguna forma de devolver esa respuesta cuando haya terminado?

Sí, use un QEventLoop, pero en general es un mal diseño ya que debe usar señales y ranuras para notificarle los cambios.

QNetworkReply* ApiRequest::req(const QString & url, const QString & method, const QByteArray & data) {
    QByteArray request_method = method.toUtf8();
    QNetworkAccessManager manager;
    QNetworkRequest request("http://127.0.0.1:9090" + url);
    request.setRawHeader("Content-Type", "application/json");
    QNetworkReply* reply = manager.sendCustomRequest(request, request_method, data);
    QEventLoop loop;
    connec(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();
    return reply;
}

// ...

void ApiRequest::requestConfig()
{
    QNetworkReply* reply = req("/configs", "GET", "");
    // ...
    reply->deleteLater();
}
2
eyllanesc 16 oct. 2019 a las 01:12