Qt Http使用——阻塞与非阻塞post请求

本文详细介绍了在Qt中如何使用QNetworkAccessManager、QNetworkRequest、QNetworkReply等类进行HTTP请求,包括设置URL、请求头,以及处理非阻塞和阻塞请求的方法。通过实例展示了如何设置请求参数、读取响应数据,并处理请求错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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();
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值