【问题标题】:Qt How can i send https request to server?Qt 如何向服务器发送 https 请求?
【发布时间】:2013-12-07 13:13:33
【问题描述】:

我尝试使用 https 网址发送获取请求。回复为空,但没有错误消息。我下载 OpenSSL 并将 libeay32.dllssleay32.dll 文件复制到 C:\Qt\Qt5.1.1\Tools\QtCreator\bin 文件夹。

代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request;
QNetworkReply *reply = NULL;

QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1_2);
request.setSslConfiguration(config);
request.setUrl(QUrl(url));
request.setHeader(QNetworkRequest::ServerHeader, "application/json");

reply = manager->get(request);

qDebug() << reply->readAll();

【问题讨论】:

  • get() 触发 /asynchronous/ 操作。在您调用 readAll() 时,还没有数据。连接reply的finished()和error()信号,读取连接finished()的slot中的数据。

标签: c++ qt https request


【解决方案1】:

正如弗兰克在他的评论中所写,get 函数是异步的,所以在您尝试阅读答案时,http 请求甚至可能还没有完成。

要解决这个问题,你需要处理finished 信号:

connect(manager, SIGNAL(finished(QNetworkReply*)), this,
                 SLOT(replyFinished(QNetworkReply*)));

并在处理程序中读取结果:

void NetworkHandler::replyFinished(QNetworkReply *reply)
{
  qDebug() << reply->readAll();
}

【讨论】:

  • 我正在使用QObject::connect(&amp;manager, &amp;QNetworkAccessManager::finished, &amp;loop, &amp;QEventLoop::quit); whre 循环是QEventLoop loop。如果没有这个事件循环,我如何使用 connect()?例如在我没有 QcoreApplication 的方法中。
  • @jeffersonferreirapalheta 你需要一个事件循环来使用 QNetworkAccessManager。如果您的代码没有在 QCoreApplication::exec() 事件循环中运行,那么您将不得不使用 QEventLoop 类,但请注意它被视为草率代码。
猜你喜欢
  • 2018-10-04
  • 2012-12-12
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2021-11-09
  • 2019-09-24
相关资源
最近更新 更多