Qt中运用HTTP协议

这篇具有很好参考价值的文章主要介绍了Qt中运用HTTP协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt使用Http协议

在使用Qt框架进行应用开发的过程中,很多时候需要进行客户端与服务端的网络通信,这时候就需要Qt的internet模块。而网络通信中最常用的协议就是http协议,Qt对http协议的调用进行了封装,使用非常方便。这里对常用的http请求demo做一下总结,方便大家参考。

在使用internet模块时需要在pro文件中添加对应的模块。

QT += network

Qt中使用Http协议与服务端通信的请求主要分为GET和POST,GET是从指定的资源请求数据,而POST是向指定的资源提交要被处理的数据。

常用的请求类型包括五类:

1.多个独立参数GET请求
2.参数数组GET请求
3.上传参数数据POST请求
4.上传参数和文件POST请求
5.下载文件GET请求

下面通过简单的Demo描述五种请求的调用方式。文章来源地址https://www.toymoban.com/news/detail-629681.html

多个独立参数GET请求

int NormalGetRequest(QString paramer1, QString paramer2)
{
    //生成对应的网络请求
    QNetworkRequest request;
    QString scheme = "http";
    QString serverAddr = "192.168.0.1";
    QString port = "80";
    QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
    QString fullRequest = requestHeader + QString("/api/vi/user/getrequest?paramer1=%1&paramer2=%2").arg(paramer1).arg(paramer2);
    request.setUrl(QUrl(fullRequest));

    //发送Get请求
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.get(request);
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

    //对请求的返回异常进行处理
    if(reply->error() != QNetworkReply::NoError)
    {
        return reply->error();
    }

    //解析返回的Json结果
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        return -1;
    }
    QJsonObject rootObj = jsonDoc.object();
    QString codeStr = rootObj.value("code").toString();
    if (codeStr.compare("200") == 0)
    {
        //返回代码为200的时候证明请求成功对包含的结构数据进行处理
        if(rootObj.contains("result"))
        {

        }
        return 0;
    }
    else
    {
        //请求失败对对应的处理
        return codeStr.toInt();
    }
}

参数数组GET请求

int GetRequestWithArray(QVector<QString> m_filePathVector)
{
    QJsonArray array;
    for(int index=0; index<m_filePathVector.size(); ++index)
    {
        QJsonObject object;
        object.insert("index",QString::number(index));
        object.insert("path",m_filePathVector.at(index));
        array.append(object);
    }

    QJsonDocument document;
    document.setArray(array);
    QString arrayString = document.toJson(QJsonDocument::Compact);

    //生成对应的网络请求
    QNetworkRequest request;
    QString scheme = "http";
    QString serverAddr = "192.168.0.1";
    QString port = "80";
    QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
    QString fullRequest = requestHeader + QString("/api/vi/user/getarray?paramers=%1").arg(arrayString);
    request.setUrl(QUrl(fullRequest));

    //获取错误
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.get(request);
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    if(reply->error() != QNetworkReply::NoError)
    {
        return reply->error();
    }

    //解析返回的Json结果
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        return -1;
    }
    QJsonObject rootObj = jsonDoc.object();
    QString codeStr = rootObj.value("code").toString();
    if (codeStr.compare("200") == 0)
    {
        //返回代码为200的时候证明请求成功对包含的结构数据进行处理
        if(rootObj.contains("result"))
        {

        }
        return 0;
    }
    else
    {
        //请求失败对对应的处理
        return codeStr.toInt();
    }
}

上传参数数据POST请求

int NormalPostRequest(QString paramer1, QString paramer2)
{
    //生成对应的网址请求
    QNetworkRequest request;
    QString scheme = "http";
    QString serverAddr = "192.168.0.1";
    QString port = "80";
    QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
    QString fullRequest = requestHeader + "/api/v1/user/postrequest";
    request.setUrl(QUrl(fullRequest));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    //获取对应的参数数据
    QByteArray data;
    data.append("paramer1=");
    data.append(paramer1.toUtf8());
    data.append("&paramer2=");
    data.append(paramer2.toUtf8());

    //发送请求
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.post(request,data);
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    if(reply->error() != QNetworkReply::NoError)
    {
        return reply->error();
    }


    //解析返回的Json结果
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        return -1;
    }
    QJsonObject rootObj = jsonDoc.object();
    QString codeStr = rootObj.value("code").toString();
    if (codeStr.compare("200") == 0)
    {
        //返回代码为200的时候证明请求成功对包含的结构数据进行处理
        if(rootObj.contains("result"))
        {

        }
        return 0;
    }
    else
    {
        //请求失败对对应的处理
        return codeStr.toInt();
    }

上传参数和文件POST请求

int PostRequestWithFile(QString paramer1, QString paramer2,QString filePath)
{

    //生成对应的网址请求
    QFileInfo fileInfo(filePath);
    QString fileName =fileInfo.fileName();

    QFile* inputFile = new QFile(filePath);
    inputFile->open(QIODevice::ReadOnly);

    //multipart请求
    QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    //文件块
    QHttpPart filePart;
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
                                 QVariant(QString("form-data; name="uploadfile";filename="%1"").arg(fileName)));
    filePart.setBodyDevice(inputFile);
    inputFile->setParent(multiPart);
    multiPart->append(filePart);

    QHttpPart paramer1Part;
    paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name="paramer1""));
    paramer1Part.setBody(paramer1.toUtf8());
    multiPart->append(paramer1Part);

    QHttpPart paramer2Part;
    paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name="paramer2""));
    paramer2Part.setBody(paramer2.toUtf8());
    multiPart->append(paramer2Part);


    //生成对应的网址请求
    QNetworkRequest request;
    QString scheme = "http";
    QString serverAddr = "192.168.0.1";
    QString port = "80";
    QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
    QString fullRequest = requestHeader + "/api/v1/user/postrequestwithfile";
    request.setUrl(QUrl(fullRequest));

    //发送请求
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.post(request,multiPart);
    multiPart->setParent(reply);

    QEventLoop eventLoop;
    QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit()));
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

    if(reply->error() != QNetworkReply::NoError)
    {
        return reply->error();
    }

    //解析返回的Json结果
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        return -1;
    }
    QJsonObject rootObj = jsonDoc.object();
    QString codeStr = rootObj.value("code").toString();
    if (codeStr.compare("200") == 0)
    {
        //返回代码为200的时候证明请求成功对包含的结构数据进行处理
        if(rootObj.contains("result"))
        {

        }
        return 0;
    }
    else
    {
        //请求失败对对应的处理
        return codeStr.toInt();
    }
}

下载文件GET请求

int DownloadFileFromWeb(QString fileUrl,QString&fileSavePath)
{
    QNetworkRequest request;
    QUrl url(fileUrl);
    QFileInfo fileInfo(url.path());
    QString fileName = fileInfo.fileName();
    QNetworkAccessManager *accessManager=new QNetworkAccessManager();
    request.setUrl(url);
    QNetworkReply *reply  = accessManager->get(request);
    QEventLoop loop;
    QObject::connect(accessManager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
//如果需要下载进度需要关联对应的信号
//connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(LoadProgress(qint64, qint64)));
    loop.exec(QEventLoop::ExcludeUserInputEvents);

    //获取下载返回值
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if (statusCode.toInt() != 200)
    {
        return -1;
    }

    //保存下载的文件
    QFile file(fileSavePath);
    if(!file.open(QIODevice::WriteOnly))
    {
        return -2;
    }
    file.write(reply->readAll());
    file.close();
    return 0;
}

到了这里,关于Qt中运用HTTP协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT】——QT中HTTP通信的使用流程

    目录 基本概念 1.QNetworkAccessManager 常用的公共成员函数 信号  2.QNetworkRequest ——HTTP请求 3.QNetworkReply——HTTP响应 HTTP通信流程 Qt中的HTTP通信访问 API 是围绕 QNetworkAccessManager 对象构建的, 该对象保存它发送的请求的通用配置和设置 ,一个 QNetworkAccessManager 实例应该足以满足整

    2024年02月15日
    浏览(23)
  • Qt下载http文件

    这是一个有问题的版本:  当要下载的文件过大时,程序会崩溃!!!(std::bad_alloc)(所以只可以下载一些小的文件) 我认为这是ba(QByteArray)太大了,要一下子往文件中写入太多的数据,导致new失败了。 修复: Qt 基于http的网络文件下载_qt http下载文件-CSDN博客(参考+引用)

    2024年01月18日
    浏览(24)
  • Qt中的HTTP

    HTTP是一种超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议,是浏览器端Web通信的基础。 B/S架构:Browser/Server,浏览器/服务器架构。 C/S架构:Client/Server,客户端/服务端架构。 B/S架构相对于C/S架构,客户机上无需安装任何软件,使用浏览器即可访

    2024年02月07日
    浏览(23)
  • QT之Http请求

    今天我们介绍一下QT的http请求,这里有post和get两种方式 一、post请求方式:参数分为网址和具体请求值两个部分,有时候还需要设置头信息,看具体情况定 二、get请求方式:参数和网址拼接到一起请求 三、主要区别: get用于请求获取数据,post向指定的资源创建修改数据 g

    2024年02月15日
    浏览(31)
  • QT-发送HTTP请求/QNetworkAccessManager

    注意,如果想使用本文相关的类,需要在项目的 .pro 文件加入网络模块,也就是需要加入下面一行代码 本文使用QT发送一个媒体类型为application/json的post请求,步骤如下: 1.首先创建一个QNetworkAccessManager类,并设置url和请求参数 2.发送请求,发送之后会返回一个QNetworkReply对象

    2024年02月02日
    浏览(26)
  • Qt + HTTP 线程交互类封装

    QT的HTTP模块封装的交互类,线程运行。使用时添加自己的业务逻辑即可

    2024年04月15日
    浏览(17)
  • ℰ悟透Qt—Http网络编程

    网络访问 API 建立在一个 QNetworkAccessManager 对象之上,该对象保存了发送请求所需的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号和可用于监视网络操作进度的回复信号。整个 Qt 应用程序只需要一个 QNetworkAccessManager 实例。由于 QNetworkAccessManager 基于

    2024年02月11日
    浏览(50)
  • Qt中使用Http通讯下载文件

    目录 前提 HTTP通讯下载 请求http文件 分解URL网址 创建会话 创建连接 创建请求 发送请求 接收http请求响应 文件操作 获取文件长度 实时下载文件 总结 在某些功能中,会使用到通过Http通讯从网址上下载资源信息。 在这里,我说的资源信息是指以.png、.mp4以及.doc为后缀的文件。

    2023年04月26日
    浏览(22)
  • 【Qt-4】QT基于qhttp-server搭建http服务器

    写在前面 :虽然qhttp-server编译成功,已生成dll库,但在使用过程中,仍出现无法打开文件: “QtSslServer/QtSslServer”的问题,在多次解决无果后,决定放弃qhttp-server,选择了QWebAPP,望知道的大佬可以帮忙解答一下,感谢~~ 一、环境搭建 1、下载及解压源文件 下载QtHttpServer源码,

    2024年02月08日
    浏览(41)
  • (Qt) Http之Get请求使用基础

    http的操作是网络通信中非常常见的操作,其中广泛使用get,post两种操作。 本文将对Qt中,http的get请求做简单应用,来进行展示。 这里不做排版了,不然篇幅过大 [1] QNetworkAccessManager 对于每个 reply 的 finish 都会发送 finished 的信号。 如果一个 manager 处理多个请求可能会出现先

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包