文章标题 原创 翻译 转载 文章内容 使用QNetworkAccessManager可以发起http请求,下面列举三种常见的场景: # get请求 这个很简单传一个url就可以了 ``` QNetworkReply *reply = manager_->get(QNetworkRequest(QUrl(url))); ``` # post请求 这里post数据使用表单的形式 ``` QUrl aurl(url); QNetworkRequest req(aurl); req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply *reply = manager_->post(req, data); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); ``` # post上传文件 注意part2和part3不是必须的,这个根据服务器的需要来填,从这里可以看出QHttpMultiPart使用方法 ``` QHttpPart part1; part1.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png")); part1.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"0.png\"")); part1.setBody(data); QHttpPart part2; part2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"engine\"")); part2.setBody("t"); QHttpPart part3; part3.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"type\"")); part3.setBody("ocrtype_tencent"); QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); multiPart->append(part1); multiPart->append(part2); multiPart->append(part3); QUrl aurl(url); QNetworkRequest req(aurl); QNetworkReply *reply = manager_->post(req, multiPart); multiPart->setParent(reply); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); ``` 完整代码: ``` #pragma once #include <QObject> #include <QNetworkReply> class QNetworkAccessManager; class HttpRequest : public QObject { Q_OBJECT public: HttpRequest(QObject *parent); ~HttpRequest(); void get(const QString &url); void post(const QString &url, const QByteArray &data); void ocrUpload(const QString &url, const QByteArray &data); signals: void sigHttpResponse(int err, const QByteArray &data); private slots: void replyFinished(QNetworkReply*); void slotError(QNetworkReply::NetworkError); private: QNetworkAccessManager *manager_; }; ``` ``` #include "HttpRequest.h" #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QHttpMultiPart> HttpRequest::HttpRequest(QObject *parent) : QObject(parent) , manager_(new QNetworkAccessManager(this)) { connect(manager_, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)), Qt::QueuedConnection); } HttpRequest::~HttpRequest() { } void HttpRequest::get(const QString &url) { QNetworkReply *reply = manager_->get(QNetworkRequest(QUrl(url))); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); } void HttpRequest::post(const QString &url, const QByteArray &data) { qDebug() << "url:" << url << "," << data; QUrl aurl(url); QNetworkRequest req(aurl); req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply *reply = manager_->post(req, data); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); } void HttpRequest::ocrUpload(const QString &url, const QByteArray &data) { QHttpPart part1; part1.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png")); part1.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"0.png\"")); part1.setBody(data); QHttpPart part2; part2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"engine\"")); part2.setBody("t"); QHttpPart part3; part3.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"type\"")); part3.setBody("ocrtype_tencent"); QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); multiPart->append(part1); multiPart->append(part2); multiPart->append(part3); QUrl aurl(url); QNetworkRequest req(aurl); QNetworkReply *reply = manager_->post(req, multiPart); multiPart->setParent(reply); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); } void HttpRequest::replyFinished(QNetworkReply *reply) { if (!reply) { LOGGER_ERROR("replyFinished is null"); return; } emit sigHttpResponse(0, reply->readAll()); reply->deleteLater(); } void HttpRequest::slotError(QNetworkReply::NetworkError err) { if (err != QNetworkReply::NoError) { LOGGER_ERROR("http response error:" << err); } } ``` 文章类别 Python Mobile Android Java Shell Life Database Bug Windows IOS Tools Boost Node.js Mac Product Tips C/C++ Golang Javascript React Qt MQ MongoDB Design Web Linux LLM ChatGPT RAG AI 提交