QNetworkRequest:网络请求
QNetworkAccessManager:协调网络操作(发射信号/身份验证请求/代理)
QNetworkReply:请求应答
信号
请求完成触发信号:finished(QNetworkReply*)
进度:downloadProgress(qint64, qint64)
可读:readyRead()
发送请求:get/post
步骤
1. 创建一个请求
QNetworkRequest request;
request.setUrl(QUrl(url));
2. 创建一个管理器
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
3. 连接请求结束信号
connect(manager, SIGNAL(finished(QNetworkReply*)), [=](QNetworkReply *reply){
if (reply->error() == QNetworkReply::NoError)
{
QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
int code = variant.toInt(); // 状态码
// 数据处理
QByteArray bytes = reply->readAll();
QString str =QString::fromUtf8(bytes);
}
else
{
qDebug() << reply->errorString() << " error " << reply->error();
}
if (reply->isRunning())
{
reply->abort(); // 立即中止操作并关闭网络连接
}
reply->deleteLater(); // 并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
reply = NULL;
});
4. 发送GET请求
QNetworkReply *reply = manager->get(request);
同步实现网络请求
QEventLoop loop; // 使用事件循环使得网络通讯同步进行
QTimer timer;
timer.setSingleShot(true); // 只会触发一次
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
connect(manager, SIGNAL(finished(QNetworkReply *)), &loop, SLOT(quit()));
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
timer.start(4000);
loop.exec(); // 进入事件循环, 直到reply的finished()信号发出, 这个语句才能
if (timer.isActive()) // 定时器还在工作,即在规定时间内请求完成
{
timer.stop();
// 数据处理
}
if (reply->isRunning())
{
reply->abort();
}
reply->deleteLater();
reply = NULL;
网络信息
// 主机名
Qstring localHostName = QHostInfo::localHostName();
QHostInfo info = QHostInfo::fromName(localHostName);
/**
* @description: 获取ip地址
* @param {type}
* @return:
*/
QString getIP()
{
QList<QHostAddress> list = QNetworkInterface::allAddresses(); // 网络接口列表
foreach (QHostAddress address, list)
{
if (address.protocol() == QAbstractSocket::IPv4Protocol)
{ // 我们使用IPv4地址
QString ip = address.toString();
if (ip.contains("127.0") or ip.contains("::1"))
{
continue;
}
return address.toString();
}
}
return "";
}