使用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

  //生成对应的网络请求
    QNetworkRequest request;
    QString requestHeader = "http://你自己的网址";
    QString fullRequest = requestHeader;
    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)
    {
        qDebug()<<reply->error();
    }

    // 获取http状态码
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    qDebug()<<"状态码:"<<statusCode;

    //解析返回的Json结果
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        qDebug()<< "error";
    }
    if(!jsonDoc.isNull()) {
        if(jsonDoc.isObject()) {
            QJsonObject jsonObj = jsonDoc.object();
            int code = jsonObj["code"].toInt();

            qDebug() << "code: " << code;
            return uuid;
        } else {
            qDebug() << "Invalid JSON object";
        }
    } else {
        qDebug() << "Failed to parse JSON";
    }

使用QNetworkRequest来实现post功能

//生成对应的网址请求
    QNetworkRequest request;

    QString fullRequest = "http://你的网址";
    request.setUrl(QUrl(fullRequest));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//因为QT和java的请求头不一致
    request.setRawHeader(QByteArray("键"), "值");//这里是设置非标准的请求头
    // 查看请求头
    qDebug()<<request.rawHeaderList();
    // 创建一个QJsonArray
    QJsonArray jsonArray;
    jsonArray.append(0);
    jsonArray.append(1);
    jsonArray.append(2);
    //传入josn
    QJsonObject object;
    object.insert("1","");//
    object.insert("test",jsonArray);//利用QJsonArray可以传入数组
    object.insert("page",1);
    QJsonDocument document;
    document.setObject( object );
    QByteArray array = document.toJson( QJsonDocument::Compact );

    qDebug()<<object;

    //发送请求
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.post(request,array);
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    if(reply->error() != QNetworkReply::NoError)
    {
        qDebug()<< reply->error();
    }
    // 获取http状态码
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    qDebug()<<"状态码:"<<statusCode;
    //解析返回的Json结果
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        qDebug()<<json_error.error<<replyData;
    }
    QJsonObject rootObj = jsonDoc.object();
    QJsonValue val = rootObj.value("code");//返回的代码,因为是double类型的所以不能转换成QString

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

#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QTcpSocket>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QByteArray>

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

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

实现代码如下:

QString token="验证指令";
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);//定义multi的方式
    // 创建一个QNetworkAccessManager对象,用于处理网络请求
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QString file_path="上传的文件路径";
    QFileInfo info(file_path);
    if(!info.isFile())
    {
        qDebug()<<"文件路径异常";
    }
    QFile *file = new QFile(file_path);
    bool  read=file->open(QIODevice::ReadOnly);
    if(read)
    {
        qDebug()<<"4";
    }
    QString http="上传文件地址";
    QString prodorderno,sort,code,filesort;
    prodorderno="生产单号";
    sort="类别";
    code="代码编号";
    filesort="文件顺序";

    QString uploadFileName = file_path;//获取文件路径
    qDebug()<<uploadFileName<<"     "<<http;
    // 创建一个QNetworkRequest对象,使用指定的URL
    QNetworkRequest request(http);
//    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/form-data");//就是这个地方,因为多写了这句代码,所以一直出错,无法解决
    request.setRawHeader(QByteArray("Authorization"), token.toLatin1());//用于验证使用的token

    //Post请求参数方法,一个参数为一个QHttpPart
    QHttpPart filePart1;
        filePart1.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        filePart1.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"code\""));
        filePart1.setBody(code.toLatin1());
        multiPart->append(filePart1);

        QHttpPart filePart2;
        filePart2.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        filePart2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"fileSort\""));
        filePart2.setBody(filesort.toLatin1());
         multiPart->append(filePart2);

        QHttpPart filePart3;
        filePart3.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        filePart3.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"prodorderno\""));
        filePart3.setBody(prodorderno.toLatin1());
        multiPart->append(filePart3);

        QHttpPart filePart4;
        filePart4.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        filePart4.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"sort\""));
        filePart4.setBody(sort.toLatin1());
        multiPart->append(filePart4);

        QHttpPart filePart5;
        filePart5.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
        QString header=QString("form-data; name=\"file\"; filename=\""+info.fileName()+"\"");//application/octet-stream
        filePart5.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(header));
        filePart5.setBodyDevice(file);
        file->setParent(multiPart);
        multiPart->append(filePart5);
        qDebug()<<QNetworkRequest::ContentTypeHeader;



//***********************************************************
    // 创建一个QNetworkReply对象,用于接收上传的响应
    QNetworkReply *reply = manager->post(request, multiPart);
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    eventLoop.exec();//QEventLoop::ExcludeUserInputEvents,不添加这个,是为了防止断网,软件卡死
    // 获取http状态码
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    qDebug()<<"状态码:"<<statusCode;
            //解析返回的Json结果
            QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
    if(json_error.error != QJsonParseError::NoError)
    {
        qDebug()<<json_error.error<<replyData;
    }
    QJsonObject rootObj = jsonDoc.object();
    QString codeStr = rootObj.value("code").toString();
    qDebug()<<rootObj;

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt可以通过QNetworkAccessManager类来实现HTTP的GET/POST请求。 1. GET请求: ```cpp QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkRequest request; request.setUrl(QUrl("http://www.example.com")); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 处理返回的数据 } else { // 处理错误 } reply->deleteLater(); }); ``` 2. POST请求: ```cpp QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkRequest request; request.setUrl(QUrl("http://www.example.com")); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QByteArray postData; postData.append("key1=value1&key2=value2"); QNetworkReply *reply = manager->post(request, postData); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 处理返回的数据 } else { // 处理错误 } reply->deleteLater(); }); ``` 以上代码仅供参考,具体实现还需要根据实际情况进行调整。 ### 回答2: Qt是一个跨平台的GUI应用程序开发框架,也支持网络编程。Qt通过QNetworkAccessManager类来访问网络资源,可以很容易地实现HTTP的GET和POST请求。 GET请求: 使用Qt进行GET请求时,需要创建QNetworkRequest对象并设置URL,然后传递到QNetworkAccessManager的get函数中。QNetworkAccessManager会自动地发送请求,并在请求完成时发出finished信号。 示例代码如下: ``` QNetworkRequest request; request.setUrl(QUrl("http://www.example.com")); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); qDebug() << data; } else { qDebug() << reply->errorString(); } reply->deleteLater(); }); ``` POST请求: 使用Qt进行POST请求时,需要创建QNetworkRequest对象并设置URL,然后传递到QNetworkAccessManager的post函数中,同时传递POST数据。Qt支持多种数据格式,包括字符串、字节数组和QIODevice对象。在POST请求中,需要设置Content-Type头部以指定POST数据的格式。 示例代码如下: ``` QNetworkRequest request; request.setUrl(QUrl("http://www.example.com")); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QByteArray postData; postData.append("param1=value1&param2=value2"); QNetworkReply *reply = manager->post(request, postData); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); qDebug() << data; } else { qDebug() << reply->errorString(); } reply->deleteLater(); }); ``` 以上是Qt实现HTTP的GET和POST请求的基本方案,根据实际需求可以自行调整和添加参数。 ### 回答3: Qt是一种跨平台应用程序开发框架,它提供了许多方便的类和函数,方便程序员开发功能强大的应用程序。Qt提供了QNetworkAccessManager类,可以用来实现Http请求的GET和POST方法。 QNetworkAccessManager是Qt中提供的用于管理网络请求的类,它使我们可以进行HTTP请求,下载和上传文件等操作。在使用QNetworkAccessManager时,首先要创建一个实例对象,并为该对象关联一个信号槽。当网络请求完成时,QNetworkAccessManager会发出一个信号,告知程序请求已完成。 下面是一个简单的例子,展示了如何使用QNetworkAccessManager实现Http的GET请求: ``` QNetworkAccessManager *manager = new QNetworkAccessManager(this); QUrl url("http://www.example.com"); QNetworkRequest request(url); QNetworkReply *reply = manager->get(request); connect(reply, SIGNAL(finished()), this, SLOT(replyFinished())); void MyClass::replyFinished() { qDebug() << reply->readAll(); reply->deleteLater(); } ``` 在上面的代码中,我们首先创建了QNetworkAccessManager的一个实例对象,然后为其关联了一个URL,发起了一个GET请求。当请求完成后,replyFinished()函数会被调用,我们在该函数中使用readAll()函数读取服务器返回的数据,并将其打印到应用程序的控制台上。 如果我们需要实现POST请求,则只需要将上面的代码稍作修改即可: ``` QNetworkAccessManager *manager = new QNetworkAccessManager(this); QUrl url("http://www.example.com"); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QByteArray postData; postData.append("key1=value1"); postData.append("&key2=value2"); QNetworkReply *reply = manager->post(request, postData); connect(reply, SIGNAL(finished()), this, SLOT(replyFinished())); void MyClass::replyFinished() { qDebug() << reply->readAll(); reply->deleteLater(); } ``` 在上述代码中,我们创建了一个QByteArray对象,用来存放需要提交的POST数据。然后用QNetworkAccessManager的post()函数提交POST请求,并在请求完成后读取服务器的响应数据。其中setHeader()函数用来设置POST请求的Content-Type header,告诉服务器发送的数据的格式。 总之,Qt提供的QNetworkAccessManager类可以方便实现HTTP的GET和POST请求。开发者可以根据自己的需求进行调整,并根据服务器返回的数据进行相应的处理和逻辑控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Helloorld_11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值