QT blocking mode write POST request

Due to the actual needs and other servers only have to return the next step, so adding an event loop waiting for the server to return

QByteArray query(QJsonObject jsonContent)
{
    QByteArray queryErrorResult ;queryErrorResult.clear();
    //设置超时处理定时器
    QTimer timer;
    timer.setInterval(10000);  // 设置超时时间 10 秒
    timer.setSingleShot(true);  // 单次触发
    // 合成URL,getIpAdressFromLocal获取IP地址
    QString qUrlS = getIpAdressFromLocal()+QString("query?random_number=1");

    QUrl qUrl(qUrlS);
    QByteArray postData;///>上传的json内容
    postData.append(QJsonDocument(jsonContent).toJson());

    // 设置发送
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    QNetworkRequest request;
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setUrl(qUrl);

    // 开启一个局部的事件循环,等待响应结束,退出
    qDebug()<<"Send: "<<jsonContent;
    QNetworkReply* reply = manager->post(request, postData);
    QEventLoop eventLoop;
    connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
    connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
    timer.start();//启动定时器
    eventLoop.exec();//启动事件循环

    if(timer.isActive()){//处理响应,定时器激活状态
        timer.stop();//停止定时器
        if(reply->error() != QNetworkReply::NoError){//http请求出错,进行错误处理
            qDebug() << "http请求出错 : " << reply->errorString();
            reply->deleteLater();
            return queryErrorResult;
        }
        else{
            // http - 响应状态码
            int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
            qDebug()<<"服务器返回的Code : "<<statusCode;
            if(statusCode==200){//http请求响应正常
                QByteArray replyContent = reply->readAll();
                return replyContent;
            }
            else{
                reply->deleteLater();
                return queryErrorResult;
            }
        }
    }
    else{//超时处理
        disconnect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
        reply->abort();
        qDebug() << "http请求超时 ";
        return queryErrorResult;
    }
    reply->deleteLater();
    return queryErrorResult;
}

Published 29 original articles · won praise 8 · views 10000 +

Guess you like

Origin blog.csdn.net/weixin_42542969/article/details/104682694