【问题标题】:NetworkReply HttpStatusCode QVariant(Invalid)NetworkReply HttpStatusCode QVariant(无效)
【发布时间】:2020-02-12 16:16:26
【问题描述】:

我正在使用下面的代码发出一个 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",
        "");
}

远程服务器确实执行了请求并回复了 204 代码。
我使用wireshark 捕获并确保它回复了204 No Content
但是,那里的输出是QVariant(Invalid)toInt 的输出是0
我尝试将PUT 更改为GET,但仍然无法正常工作。

【问题讨论】:

    标签: qt qt5 qnetworkaccessmanager qnetworkreply qnetworkrequest


    【解决方案1】:

    即使没有发出请求,你也在分析状态,所以结果为空是有效的,你应该做的是在发出完成的信号时分析它:

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

    更新:

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

    更新 2:

    有没有办法在回复完成后返回该回复?

    是的,使用 QEventLoop,但通常这是一个糟糕的设计,因为您应该使用信号和插槽来通知您更改。

    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();
    }
    

    【讨论】:

    • 如果我想在完成后返回经理。怎么办?
    • 很抱歉没有解释清楚。我已经更新了代码。有没有办法在完成后返回该回复?谢谢:D
    • @Coel 查看更新。我已经展示了解决方案,但总的来说,您尝试做的是糟糕的设计
    • 非常感谢您解答问题。这帮助很大。
    • 当然。非常感谢您的帮助:)
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多