QNetworkAccessManager 网络请求管理类
允许使用这个类发送网络请求和接收网络请求回复,可以发送HTTP GET请求、POST请求。
QNetworkRequest 网络请求类
保存网络请求的信息,例如网络请求头,网络请求位置等。
QNetworkReply 网络请求回复类
保存了网络请求回复的数据和请求头。
1、GET 请求
QByteArray request( QString request_url )
{
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get( QNetworkRequest( request_url ) );
/* 等待请求返回结果 */
QEventLoop loop;
connect(&manager, SIGNAL(finished(QNetworkReply *)), &loop, SLOT(quit()));
loop.exec();
/* 读取请求的数据 */
QByteArray recevied_data = reply->readAll();
/* 释放 reply 内存, 否则会造成内存泄漏 */
delete reply;
reply = nullptr;
return recevied_data;
}
int main( int argc, char **argv )
{
QString request_url = QString("http://192.168.1.100:8090/api/test/getUsername?ip=%1").arg( 192.168.1.200);
QByteArray receive_data = request( request_url );
}
2、POST 请求
QByteArray request( QString request_url, QByteArray &data )
{
QNetworkAccessManager manager;
/* 新的数据请求 */
QNetworkRequest request(urequested_url);
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
/* POST 请求 */
QNetworkReply *preply = manager.post(request, data);
/* 等待返回请求结果 */
QEventLoop loop;
connect(&manager, SIGNAL(finished(QNetworkReply *)), &loop, SLOT(quit()));
loop.exec();
/* 读取结果 */
QByteArray result = preply->readAll();
/* 释放 preply 内存, 否则造成内存泄漏 */
delete preply;
preply = nullptr;
return result;
}
int main( int argc, char **argv )
{
QString request_url = QString("http://192.168.1.100:8090/api/test/getUsername");
QByteArray data( "{\"IP\":\"192.168.1.200\"}" );
QByteArray request_data = request( request_url, data );
}
注意:因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以POST 请求需要对应的依赖库,否则会请求会报 TLS initialization failed 错误 。
如果是 mingW 环境可以到 Qt\Qt5.13.0\Tools\mingw730_64\opt\bin 路径拷贝 libeay32.dll 和 ssleay32.dll 到应用程序同级目录下。如果是 vs-qt 环境需要 libcrypto-1_1-x64.dll 和 libssl-1_1-x64.dll 这两个库。
QEventLoop 方式为同步阻塞式,也可以使用信号槽实现异步非阻塞式。
connect( preply, &QNetworkReply::finished, this, &HttpRequire::slot_http_finished );
connect( preply, &QIODevice::readyRead, this, &HttpRequire::slot_http_ready_read );