• 基于QT实现发送http的get和post请求(post还可以实现上传文件),同时实现接收返回json数据,并对其进行解析


    使用到中重要的类,做个简单的介绍

    QNetworkAccessManager:这个类是QT帮我们封装好的工具类,主要可以用来发送Http请求
    QNetworkReply:这个类主要用来监听发送的请求,并得到请求的响应结果
    QHttpMultiPart:这个类主要用于封装post请求的二进制参数的数据
    QEventLoop:这个类是一个控制事件
    QJsonDocument:这个类用于解析JSON

    头文件:

    1. #ifndef HTTPTEST_H
    2. #define HTTPTEST_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include //以下是json数据传送所需头文件
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. class myHttp : public QObject
    17. {
    18. Q_OBJECT
    19. public:
    20. explicit myHttp(QObject *parent = nullptr);
    21. void sendGetRequest();
    22. void sendPostRequest();
    23. QString resultGet;
    24. QString resultPost;
    25. public slots:
    26. void receiveReplyGet(QNetworkReply *reply);
    27. void receiveReplyPost(QNetworkReply *reply);
    28. };
    29. #endif // HTTPTEST_H

    cpp文件

    1. #include "myHttp.h"
    2. myHttp::myHttp(QObject *parent) : QObject(parent)
    3. {
    4. }
    5. void myHttp::sendGetRequest()
    6. {
    7. qDebug()<<"get方法被执行";
    8. QNetworkRequest request1;
    9. QNetworkAccessManager nam;
    10. connect(&nam, &QNetworkAccessManager::finished, this, &myHttp::receiveReplyGet);
    11. //get与post的请求方式有所不同,get是在接口名后添加 ? 和传输的数据(type)
    12. request1.setUrl(QUrl("http://localhost:8080/dish/page?hello=666&name=hjl&age=18"));
    13. request1.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
    14. QString token = "xxxxxxxxxxxxxxxxxxxxxxxx";
    15. QString token_headerData = token;
    16. request1.setRawHeader("token",token_headerData.toLocal8Bit());
    17. QNetworkReply *reply = nam.get(request1); //get请求头
    18. //开启事件循环,直到请求完成
    19. QEventLoop loop;
    20. connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
    21. loop.exec();
    22. }
    23. void myHttp::receiveReplyGet(QNetworkReply *reply)
    24. {
    25. qDebug()<<"得到get方法的返回值";
    26. // 获取状态码
    27. int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    28. // 获取响应数据
    29. QString reply_data = reply->readAll();
    30. qDebug()<
    31. resultGet=reply_data;
    32. //解析json字符串
    33. QJsonDocument jsonDoc = QJsonDocument::fromJson(reply_data.toUtf8());
    34. QJsonObject jsonObj = jsonDoc.object();
    35. QString date = jsonObj["date"].toString();
    36. int code = jsonObj["code"].toInt();
    37. QString msg = jsonObj["mes"].toString();
    38. qDebug()<
    39. }
    40. void myHttp::sendPostRequest()
    41. {
    42. qDebug()<<"post方法被执行";
    43. QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    44. //封装文本参数
    45. QHttpPart textPart;
    46. textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=text"));
    47. textPart.setBody("text");
    48. //封装文件参数
    49. QHttpPart filePart;
    50. filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=file; filename=output.wav"));
    51. QString filename="F:\\output.wav";
    52. QFile file(filename);
    53. QByteArray bytes;
    54. if (!file.exists()) {
    55. qDebug() << "文件不存在";
    56. return;
    57. }
    58. if (file.open(QFile::ReadOnly)) {
    59. bytes = file.readAll();
    60. qDebug() << "状态:读取文件成功";
    61. }
    62. file.close();
    63. filePart.setBody(bytes);
    64. qDebug()<size();
    65. //将封装到的参数加入到这个对象中
    66. multiPart->append(textPart);
    67. multiPart->append(filePart);
    68. QUrl url("http://localhost:8080/common/upload?age=18&hobby=football");
    69. QNetworkRequest request(url);
    70. request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/form-data; boundary="+multiPart->boundary()));
    71. QNetworkAccessManager manager;
    72. connect(&manager, &QNetworkAccessManager::finished, this, &myHttp::receiveReplyPost);
    73. QNetworkReply *reply = manager.post(request, multiPart);
    74. //开启事件循环,直到请求完成
    75. QEventLoop loop;
    76. connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
    77. loop.exec();
    78. }
    79. void myHttp::receiveReplyPost(QNetworkReply *reply)
    80. {
    81. qDebug()<<"post方法返回";
    82. // 获取状态码
    83. int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    84. // 获取响应数据
    85. QString reply_data = reply->readAll();
    86. resultPost=reply_data;
    87. //解析json字符串
    88. QJsonDocument jsonDoc = QJsonDocument::fromJson(reply_data.toUtf8());
    89. QJsonObject jsonObj = jsonDoc.object();
    90. QString date = jsonObj["data"].toString();
    91. int code = jsonObj["code"].toInt();
    92. QString msg = jsonObj["msg"].toString();
    93. qDebug()<
    94. }

    效果:

    最后,如有不足欢迎指正,如有疑问,欢迎评论

  • 相关阅读:
    萤火伴孤舟
    wireshark流量分析
    什么是IFTMBF运输预定请求?
    重建大师密集匹配失败,是什么原因?
    Java中TypeReference用法说明
    【优化模型】求无约束多元函数最小值
    hdfs读流程
    Windows / Linux 修改 Anaconda3 虚拟环境名的方法
    高等数学(第七版)同济大学 习题10-5 个人解答
    CorelDraw插件开发-X4-反调试分析-CDR插件开发
  • 原文地址:https://blog.csdn.net/weixin_45533131/article/details/133211215