//重写的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);//发送完删除