qt的http服务器成功处理向外网请求并发送给自己客户端,服务器的请求来自自己客户端的请求,

//重写的service虚函数
service(HttpRequest &request, HttpResponse &response)
HttpRequest的实现中发送数据类的信号,把请求的ID传递到Database槽
 DataBase &database = DataBase::instance();
 database.getSignals(RawParameters);

Database的构造函数中做两个信号槽连接,其中Lambda的addressGet是QMap<QString,QByteArray>addressGet,存储ID和请求值,服务器发送给客户端时候取出来。这里数据没有做读写锁的操作,因为每个ID是唯一的,发送完可以删除容器内ID,对其他客户端不影响

    connect(this,&DataBase::getSignals,this,&DataBase::getSlots,Qt::QueuedConnection);

    manager = new QNetworkAccessManager(this);

    connect(manager, &QNetworkAccessManager::finished,[=](QNetworkReply *reply){

        if (reply->error()) {
            qDebug() << "ERROR:" << reply->errorString();
        } else {

            QByteArray marray = reply->readAll();
            addressGet.insert(mId,marray);
            QJsonDocument document = QJsonDocument::fromJson(marray);
            QJsonObject objct = document.object();

            qDebug()<<"请求成功---------"<<objct.keys();
            qDebug()<<objct.value(objct.keys().at(0));
            qDebug()<<"array:----------"<<marray;

        }
        reply->deleteLater();
    });

Database槽函数getSlots(QByteArray id)实现

void DataBase::getSlots(QByteArray id)
{
    QString rawParameters = id;
    QStringList rawParemetersList = rawParameters.split("=");
    mId = rawParemetersList.value(1);
    QUrl url("https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=sh600519");
    QNetworkRequest mrequest(url);
    manager->get(mrequest);
}

在重写的service中可以加个while循环判断或等待QMap<QString,QByteArray>addressGet存储请求到的数据

    QByteArray array;
    DataBase &database = DataBase::instance();
    while (!database.getAddressGet().contains(code)) {
       qDebug()<<"等待请求结果";
    }

    array = database.getAddressGet().value(code);
    response.write(array);
    database.getAddressGet().remove(code);//发送完删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值