Qt Network Access 之 GET 和 POST 请求

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 );

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值