在Qt使用Http进行请求,主要使用的是以下几个类:
QNetworkAccessManager ; 用来发送网络请求和接收应答
QNetworkRequest ; 网络请求类
QNetworkReply; 网络回复类
QUrl ; 地址类
在构造函数或者连接函数中 ,进行地址,请求头设置。非阻塞请求,通过管理器的finished信号和槽函数进行处理,收到消息返回会发出信号
url = QUrl("http://192.1.1.2/gwfun.asp");//url
request.setUrl(url);
manager = new QNetworkAccessManager(this);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form/urlencoded");
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(slotHttp(QNetworkReply *)));
void MainWindow::slotHttp(QNetworkReply *reply)
{
QString str = reply->readAll();
if(reply->error()==QNetworkReply::NoError)
{
qDebug() << "read all" << str;}
}
}
void MainWindow::slotGetTimerDt()
{
QByteArray data("reqType=19");//类型码
manager->post(request, data);
if(QNetworkReply::NoError == reply->error())
{
qDebug()<<"SetNet post is OK!!!";;
}
else
{
qDebug()<<"SetNet post is error: "<< reply->error();
}
}
阻塞请求时通过请求后开启事件循环,关联finished信号和事件退出参函数。,超时溢出信号和事件退出槽函数
url = QUrl("http://192.1.1.2/gwfun.asp");//url
request.setUrl(url);
timer=new QTimer;
mainTimer=new QTimer;
manager = new QNetworkAccessManager(this);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form/urlencoded");
connect(manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
connect(timer,SIGNAL(timeout()), this, SLOT(slotTimerout()));
void WidHttp::sendPost(QString str)
{
QByteArray data=str.toLatin1();
reply = manager->post(request, data);
if(QNetworkReply::NoError == reply->error())
{
qDebug()<<"SetNet post is OK!!!";;
}
else
{
qDebug()<<"SetNet post is error: "<< reply->error();
}
timer->start(1000);
eventLoop.exec();
if(timer->isActive())
{
timer->stop();
qDebug()<<"timer.stop";
}
else
{
QMessageBox msgBox;
msgBox.setWindowFlags(Qt::FramelessWindowHint);
msgBox.setButtonText(QMessageBox::Ok,QString::fromUtf8("确定"));
msgBox.setText(QString::fromUtf8("请求超时"));
msgBox.exec();
}
}
void WidHttp::oneProcessFinished(int flag)
{
QString str=reply->readAll();
if(reply->error()==QNetworkReply::NoError)
{
qDebug() << "read all" << str;
}
}
void WidHttp::slotTimerout()
{
timer->stop();
eventLoop.quit();
}