• 使用QT实现http里面的get和post


    #1024程序员节|参与投稿,赢限定勋章和专属大奖#

    #假如你有一台服务器,你最想做哪些事?#

    #你被什么样的BUG困扰过一周以上?#

    在http里面下面这些方法和服务器的响应代码一起用于HTTP协议中的请求和响应交互。请注意,这些函数不是由编程语言实现的,而是由HTTP协议规定的。因此,无论使用哪种编程语言进行HTTP通信,都可以使用这些函数和响应代码进行发送和接收操作。

    请求相关函数:

    1. GET:用于请求指定的资源。
    2. POST:用于向指定资源提交数据,请求服务器进行处理。
    3. PUT:用于更新指定资源的内容。
    4. DELETE:用于删除指定资源。
    5. HEAD:与GET方法类似,但不返回响应体,只获取HTTP头信息。
    6. OPTIONS:用于获取目标资源支持的通信选项。
    7. CONNECT:用于建立网络连接以供隧道传输。
    8. TRACE:用于进行消息回环测试。

    响应相关函数:

    1. 200 OK:表示成功响应,请求已成功被处理。
    2. 201 Created:表示成功创建了新资源。
    3. 202 Accepted:表示请求已被接受,继续处理。
    4. 204 No Content:表示成功处理了请求,但无响应体内容。
    5. 301 Moved Permanently:表示资源已被永久移动到新位置。
    6. 302 Found:表示资源已被临时移动到新位置。
    7. 303 See Other:表示由于其他位置的响应可能更适合,建议查看其他位置。
    8. 304 Not Modified:表示请求的资源未被修改,客户端可继续使用缓存的版本。
    9. 400 Bad Request:表示请求格式错误或请求无法被服务器理解。
    10. 401 Unauthorized:表示请求需要身份验证,但未提供认证信息。
    11. 403 Forbidden:表示请求被服务器拒绝,即使提供了认证信息也不允许访问。
    12. 404 Not Found:表示请求的资源不存在。
    13. 500 Internal Server Error:表示服务器内部错误,无法完成请求。
    14. 501 Not Implemented:表示服务器不支持请求的方法。
    15. 502 Bad Gateway:表示作为网关或代理服务器时,服务器从上游服务器接收到的响应是无效的。
    16. 503 Service Unavailable:表示服务器暂时不可用,无法处理请求。

    在这里用QT来演示一哈如何使用http协议,获取和传递信息:

    具体代码如下所示:

    使用QNetworkRequest来实现get

    1. //生成对应的网络请求
    2. QNetworkRequest request;
    3. QString requestHeader = "http://你自己的网址";
    4. QString fullRequest = requestHeader;
    5. request.setUrl(QUrl(fullRequest));
    6. //发送Get请求
    7. QNetworkAccessManager manager;
    8. QNetworkReply *reply = manager.get(request);
    9. QEventLoop eventLoop;//开启一个事件,当这个事件接收到完成的信号的时候,就结束循环
    10. QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    11. eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    12. //对请求的返回异常进行处理
    13. if(reply->error() != QNetworkReply::NoError)
    14. {
    15. qDebug()<error();
    16. }
    17. // 获取http状态码
    18. QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    19. qDebug()<<"状态码:"<
    20. //解析返回的Json结果
    21. QByteArray replyData = reply->readAll();
    22. QJsonParseError json_error;
    23. QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    24. if(json_error.error != QJsonParseError::NoError)
    25. {
    26. qDebug()<< "error";
    27. }
    28. if(!jsonDoc.isNull()) {
    29. if(jsonDoc.isObject()) {
    30. QJsonObject jsonObj = jsonDoc.object();
    31. int code = jsonObj["code"].toInt();
    32. qDebug() << "code: " << code;
    33. return uuid;
    34. } else {
    35. qDebug() << "Invalid JSON object";
    36. }
    37. } else {
    38. qDebug() << "Failed to parse JSON";
    39. }

    使用QNetworkRequest来实现post功能

    1. //生成对应的网址请求
    2. QNetworkRequest request;
    3. QString fullRequest = "http://你的网址";
    4. request.setUrl(QUrl(fullRequest));
    5. request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//因为QT和java的请求头不一致
    6. request.setRawHeader(QByteArray("键"), "值");//这里是设置非标准的请求头
    7. // 查看请求头
    8. qDebug()<rawHeaderList();
    9. // 创建一个QJsonArray
    10. QJsonArray jsonArray;
    11. jsonArray.append(0);
    12. jsonArray.append(1);
    13. jsonArray.append(2);
    14. //传入josn
    15. QJsonObject object;
    16. object.insert("1","");//
    17. object.insert("test",jsonArray);//利用QJsonArray可以传入数组
    18. object.insert("page",1);
    19. QJsonDocument document;
    20. document.setObject( object );
    21. QByteArray array = document.toJson( QJsonDocument::Compact );
    22. qDebug()<
    23. //发送请求
    24. QNetworkAccessManager manager;
    25. QNetworkReply *reply = manager.post(request,array);
    26. QEventLoop eventLoop;
    27. QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    28. eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    29. if(reply->error() != QNetworkReply::NoError)
    30. {
    31. qDebug()<< reply->error();
    32. }
    33. // 获取http状态码
    34. QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    35. qDebug()<<"状态码:"<
    36. //解析返回的Json结果
    37. QByteArray replyData = reply->readAll();
    38. QJsonParseError json_error;
    39. QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    40. if(json_error.error != QJsonParseError::NoError)
    41. {
    42. qDebug()<
    43. }
    44. QJsonObject rootObj = jsonDoc.object();
    45. QJsonValue val = rootObj.value("code");//返回的代码,因为是double类型的所以不能转换成QString

    在post里面要注意,有的参数需要提交,需要借助QJsonObject转变成 QByteArray。需要注意数据格式的问题,比如数组要转换成json的格式,毕竟C++和java是两种语言。另外,如果要在QT里面使用上述代码,还要记得包含以下的头文件,不然会报错:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include

    另外,在 Qt 库中,QJsonValue 实际上可以是一种通用的 JSON 数据类型,包括数组和对象。因此,将 QJsonValue 转换为 QJsonArray 并不总是一个明确的过程。然而,如果你确定该 QJsonValue 实际上是一个 JSON 数组,那么可以使用 QJsonValue::toArray() 方法将其转换为 QJsonArray

    QT通过http的post上传带有参数的文件到指定网址。

    实现代码如下:

    1. QString token="验证指令";
    2. QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);//定义multi的方式
    3. // 创建一个QNetworkAccessManager对象,用于处理网络请求
    4. QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    5. QString file_path="上传的文件路径";
    6. QFileInfo info(file_path);
    7. if(!info.isFile())
    8. {
    9. qDebug()<<"文件路径异常";
    10. }
    11. QFile *file = new QFile(file_path);
    12. bool read=file->open(QIODevice::ReadOnly);
    13. if(read)
    14. {
    15. qDebug()<<"4";
    16. }
    17. QString http="上传文件地址";
    18. QString prodorderno,sort,code,filesort;
    19. prodorderno="生产单号";
    20. sort="类别";
    21. code="代码编号";
    22. filesort="文件顺序";
    23. QString uploadFileName = file_path;//获取文件路径
    24. qDebug()<<uploadFileName<<" "<<http;
    25. // 创建一个QNetworkRequest对象,使用指定的URL
    26. QNetworkRequest request(http);
    27. // request.setHeader(QNetworkRequest::ContentTypeHeader, "application/form-data");//就是这个地方,因为多写了这句代码,所以一直出错,无法解决
    28. request.setRawHeader(QByteArray("Authorization"), token.toLatin1());//用于验证使用的token
    29. //Post请求参数方法,一个参数为一个QHttpPart
    30. QHttpPart filePart1;
    31. filePart1.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
    32. filePart1.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"code\""));
    33. filePart1.setBody(code.toLatin1());
    34. multiPart->append(filePart1);
    35. QHttpPart filePart2;
    36. filePart2.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
    37. filePart2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"fileSort\""));
    38. filePart2.setBody(filesort.toLatin1());
    39. multiPart->append(filePart2);
    40. QHttpPart filePart3;
    41. filePart3.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
    42. filePart3.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"prodorderno\""));
    43. filePart3.setBody(prodorderno.toLatin1());
    44. multiPart->append(filePart3);
    45. QHttpPart filePart4;
    46. filePart4.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
    47. filePart4.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"sort\""));
    48. filePart4.setBody(sort.toLatin1());
    49. multiPart->append(filePart4);
    50. QHttpPart filePart5;
    51. filePart5.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
    52. QString header=QString("form-data; name=\"file\"; filename=\""+info.fileName()+"\"");//application/octet-stream
    53. filePart5.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(header));
    54. filePart5.setBodyDevice(file);
    55. file->setParent(multiPart);
    56. multiPart->append(filePart5);
    57. qDebug()<<QNetworkRequest::ContentTypeHeader;
    58. //***********************************************************
    59. // 创建一个QNetworkReply对象,用于接收上传的响应
    60. QNetworkReply *reply = manager->post(request, multiPart);
    61. QEventLoop eventLoop;
    62. QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    63. eventLoop.exec();//QEventLoop::ExcludeUserInputEvents,不添加这个,是为了防止断网,软件卡死
    64. // 获取http状态码
    65. QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    66. qDebug()<<"状态码:"<<statusCode;
    67. //解析返回的Json结果
    68. QByteArray replyData = reply->readAll();
    69. QJsonParseError json_error;
    70. QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    71. if(json_error.error != QJsonParseError::NoError)
    72. {
    73. qDebug()<<json_error.error<<replyData;
    74. }
    75. QJsonObject rootObj = jsonDoc.object();
    76. QString codeStr = rootObj.value("code").toString();
    77. qDebug()<<rootObj;

  • 相关阅读:
    认识电磁干扰?|深圳比创达EMC
    【牛客网刷题】中秋节前开启java专项练习错题总结第一天
    Java 重写、重载,这篇文章看了就明白
    MySQL高级
    Acwing 1169. 糖果
    提升品牌形象:利用OLED透明拼接屏进行品牌展示
    【C++学习】基础1
    论文阅读——EarthPT
    省钱兄情侣飞行棋小程序会让爱情在游戏中更加美妙
    隐式类型转换(整形提升)
  • 原文地址:https://blog.csdn.net/Helloorld_1/article/details/133925786