I send a Post request like this:

QNetworkAccessManager * pManager = new QNetworkAccessManager; connect(pManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinish(QNetworkReply*))); pManager->post( QNetworkRequest(QUrl("http://www.s92640jz.bget.ru/register.php")), QString("login=login&pass=pass&open_key=open_key&key_size=key_size").toUtf8()); qDebug() << pManager; 

On the server lies the following script:

  if (!empty($_POST["login"])&&!empty($_POST["pass"])&&!empty($_POST["open_key"])&&!empty($_POST["key_size"])) { echo "POST data:<br>"; echo "id - "; echo $_POST["id"]; echo "<br>login - "; echo $_POST["login"]; echo "<br>pass - "; echo $_POST["pass"]; echo "<br>hash_value - "; echo $_POST["hash_value"]; echo "<br>sault - "; echo $_POST["sault"]; echo "<br>open_key - "; echo $_POST["open_key"]; echo "<br>key_size - "; echo $_POST["key_size"]; echo "<br>id_dialogs - "; echo $_POST["id_dialogs"]; } 

The problem is that in qDebug I get the answer:

 qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method QNetworkAccessManager(0x91c50b8) content-type missing in HTTP POST, defaulting to application/x-www-form-urlencoded. Use QNetworkRequest::setHeader() to fix this problem. 

What am I doing wrong? How can I send a post request with parameters and get the answer as a string?

2 answers 2

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(); }); 
  • qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method qt.network.ssl: QSslSocket: can not resolve SSLv2_server_method QNetworkReplyHttpImpl (0x9903e98) This is the response to the qDebug () << reply command; - Nikola Krivosheya
  • one
    Um ... I suddenly realized that you do not have a clue about what you are writing, and how it functions at all, that is why we left such a strange comment. I will try to supplement the answer with the account of the information that has been opened. - alexis031182
  • I found a working library and an example of QCURL v2.0 is good for Google and it also works - Nikola Krivosheya

I found a working library and an example of QCURL v2.0 is googling well and also works

 QCURL cur; RequestData rd; QByteArray RequestResult; rd.Method = CURL::POST; rd.url = "http://www.s92640jz.bget.ru/register.php"; //----- формирование пост параметров ------- rd.PostData.insert("login","login"); rd.PostData.insert("pass","pass"); rd.PostData.insert("open_key","open_key"); rd.PostData.insert("key_size","key_size"); //---- и отправка файла -------------------- //rd.PostFiles.insert("upload_data","c:\\users\\foto.zip"); RequestResult = cur.SendRequest(rd); qDebug() << RequestResult;