Rather than trying to build HTTP headers yourself, it’s better to use Qt’s tools. The QHttpPart and QHttpMultiPart appeared since version 4.8 of the framework.
QVariantMap opts; opts.insert("login", "my_login"); opts.insert("pass", "my_pass"); opts.insert("open_key", "my_open_key"); opts.insert("key_size", "my_key_size"); QHttpMultiPart *mpart = new QHttpMultiPart(QHttpMultiPart::FormDataType); for(auto itr = opts.constBegin(); itr != opts.constEnd(); ++itr) { QHttpPart part; part.setHeader(QNetworkRequest::ContentDispositionHeader , QString("form-data; name=\"%1\"").arg(itr.key())); part.setBody(itr.value().toByteArray()); mpart->append(part); } QNetworkReply *reply = pManager->post(QNetworkRequest(url), mpart); // Не забудьте назначить ответ в качестве родителя, иначе будет утечка. mpart->setParent(reply); ...
Despite the fact that the author of the request found an acceptable solution for himself, nevertheless, a listing of one of the possible variants of a class that implements sending POST requests using Qt may be useful.
Poster.h file:
#ifndef POSTER_H #define POSTER_H #include <QtCore/QObject> class QNetworkAccessManager; class Poster : public QObject { Q_OBJECT signals: void finished(const QByteArray &data); public: explicit Poster(QObject *parent = NULL); virtual ~Poster() {} const QByteArray &data() const; public slots: void post(const QUrl &url, const QVariantMap &opts); private: QNetworkAccessManager *_nam; private slots: void onLoadFinished(); }; #endif
Poster.cpp file:
#include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QNetworkRequest> #include <QtNetwork/QHttpMultiPart> #include <QtNetwork/QNetworkReply> #include "poster.h" Poster::Poster(QObject *parent) : QObject(parent) , _nam(new QNetworkAccessManager(this)) {} void Poster::post(const QUrl &url, const QVariantMap &opts) { QHttpMultiPart *mpart = new QHttpMultiPart(QHttpMultiPart::FormDataType); for(auto itr = opts.constBegin(); itr != opts.constEnd(); ++itr) { QHttpPart part; part.setHeader(QNetworkRequest::ContentDispositionHeader , QString("form-data; name=\"%1\"").arg(itr.key())); part.setBody(itr.value().toByteArray()); mpart->append(part); } QNetworkReply *reply = _nam->post(QNetworkRequest(url), mpart); mpart->setParent(reply); connect(reply, &QNetworkReply::finished() , this, &Poster::onLoadFinished()); } void Poster::onLoadFinished() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if(reply == Q_NULLPTR) return; const int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if(status_code == 200) emit finished(reply->readAll()); else qDebug() << reply->error(); reply->deleteLater(); }
Use based on sample data from a question (C ++ 11):
QVariantMap opts; opts.insert("login", "my_login"); opts.insert("pass", "my_pass"); opts.insert("open_key", "my_open_key"); opts.insert("key_size", "my_key_size"); QUrl url("http://www.s92640jz.bget.ru/register.php"); Poster *poster = new Poster(this); poster->post(url, opts); connect(poster, &Poster::finished, [poster](const QByteArray &data) { qDebug() << data; poster->deleteLater(); });