QNetworkAccessManager post不了数据的问题

Marcelxx 2017-02-15 11:57:49
单独建立一个Qt程序,代码如:

QNetworkRequest request;

QByteArray line;

request.setUrl(QUrl("http://192.168.1.117:8070/api/yakInterface/yakRecordRealPosition/addYakRecordRealPosition"));

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");


QByteArray append("{\"id\":null,\"simCode\":134.0,\"longitude\":12345.0,\"latitude\":12345.0,\"height\":15.0,\"time\":12345,\"deviceCode\":\"M110 - niu\",\"speed\":180}");

QNetworkReply* reply = m_pNetWorkManager->post(request, append);

能Post出去数据。
我在一个另一个QT程序中,里面使用LibEvent网络库,再使用如上的Post方式时,使用抓包工具发现,Post没有发出去任何数据。
请问,该如何解决。。。。
...全文
1627 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
windywater119 2017-02-27
  • 打赏
  • 举报
回复
libevent里使用Qt network类,好奇怪的使用方式,为啥不用libevent自己的函数?libevent和Qt各有各的事件循环,混用容易出问题,要不就在合适的地方加上QCoreApplication::processEvents试试吧。
ly1chee 2017-02-16
  • 打赏
  • 举报
回复
使用同步HTTP和效率没啥关系,开启事件循环也是常量级的开销,看你喜欢那个方式。 main() { return app.exec(); // 这句就已经开启了Qt的事件循环了,所以我没明白你说的无法开启Qt的事件循环是什么意思 }
Marcelxx 2017-02-15
  • 打赏
  • 举报
回复
引用 1 楼 Kenier 的回复:
QNetworkReply* reply = m_pNetWorkManager->post(request, append);
这句代码执行完之后,执行流程需要回到事件循环当中,post才会被执行。 可以向下面这样异步执行:
void on_button_clicked()
{
	QNetworkRequest request;
	QByteArray line;
	request.setUrl(QUrl("http://192.168.1.117:8070/api/yakInterface/yakRecordRealPosition/addYakRecordRealPosition"));
	request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
	QByteArray append("{\"id\":null,\"simCode\":134.0,\"longitude\":12345.0,\"latitude\":12345.0,\"height\":15.0,\"time\":12345,\"deviceCode\":\"M110 - niu\",\"speed\":180}");
	m_reply = m_pNetWorkManager->post(request, append);
	connect(m_reply, &QNetworkReply::finished, this, &MainWindow::on_reply_finished);
}
void on_reply_finished()
{
	if (m_reply->error() == QNetworkReply::NoError) {
		// 成功
	} else {
		// 失败
	}
}
或者同步:
void on_button_clicked()
{
	QNetworkRequest request;
	QByteArray line;
	request.setUrl(QUrl("http://192.168.1.117:8070/api/yakInterface/yakRecordRealPosition/addYakRecordRealPosition"));
	request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
	QByteArray append("{\"id\":null,\"simCode\":134.0,\"longitude\":12345.0,\"latitude\":12345.0,\"height\":15.0,\"time\":12345,\"deviceCode\":\"M110 - niu\",\"speed\":180}");
	QNetworkReply *reply = m_pNetWorkManager->post(request, append);
	QEventLoop loop;
	connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
	loop.exec();
	if (reply->error() == QNetworkReply::NoError) {
		// 成功
	} else {
		// 失败
	}
}
由于我在libEvent中开启了一个事件循环,无法开启Qt的事件循环,导致不会发送数据。我使用这种方式
	QEventLoop loop;
	QNetworkRequest request;

	QByteArray line;

	request.setUrl(QUrl(SERVERCONFIG.GetBaseDBIpInfo().append(SERVERCONFIG.GetBaseDBApi())));

	request.setHeader(QNetworkRequest::ContentTypeHeader, HTTP_HEADER);

	QNetworkReply* reply = m_pNetWorkManager->post(request, GetData());
	connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
	loop.exec();
数据才能发送成功,但是这样同步的话,会导致效率不是很高,有没有其他的什么解决方法? 注:我开启了LibEvent的事件循环,导致无法开启Qt的事件循环,就只有用同步的方法,有没有在不开启Qt的事件循环的情况下,使用异步的方式?
ly1chee 2017-02-15
  • 打赏
  • 举报
回复
QNetworkReply* reply = m_pNetWorkManager->post(request, append);
这句代码执行完之后,执行流程需要回到事件循环当中,post才会被执行。 可以向下面这样异步执行:
void on_button_clicked()
{
	QNetworkRequest request;
	QByteArray line;
	request.setUrl(QUrl("http://192.168.1.117:8070/api/yakInterface/yakRecordRealPosition/addYakRecordRealPosition"));
	request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
	QByteArray append("{\"id\":null,\"simCode\":134.0,\"longitude\":12345.0,\"latitude\":12345.0,\"height\":15.0,\"time\":12345,\"deviceCode\":\"M110 - niu\",\"speed\":180}");
	m_reply = m_pNetWorkManager->post(request, append);
	connect(m_reply, &QNetworkReply::finished, this, &MainWindow::on_reply_finished);
}
void on_reply_finished()
{
	if (m_reply->error() == QNetworkReply::NoError) {
		// 成功
	} else {
		// 失败
	}
}
或者同步:
void on_button_clicked()
{
	QNetworkRequest request;
	QByteArray line;
	request.setUrl(QUrl("http://192.168.1.117:8070/api/yakInterface/yakRecordRealPosition/addYakRecordRealPosition"));
	request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
	QByteArray append("{\"id\":null,\"simCode\":134.0,\"longitude\":12345.0,\"latitude\":12345.0,\"height\":15.0,\"time\":12345,\"deviceCode\":\"M110 - niu\",\"speed\":180}");
	QNetworkReply *reply = m_pNetWorkManager->post(request, append);
	QEventLoop loop;
	connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
	loop.exec();
	if (reply->error() == QNetworkReply::NoError) {
		// 成功
	} else {
		// 失败
	}
}

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧