Как я могу отправить данные на URL с помощью QNetworkAccessManager - PullRequest
55 голосов
/ 08 апреля 2010

У меня есть веб-сервис, который мне нужно ПОСТАВИТЬ некоторые данные для использования Qt. Я подумал, что могу использовать QByteArray при размещении сообщений в веб-сервисе.

У меня вопрос, как я могу отформатировать этот массив для правильного анализа на другом конце?

Это код, который у меня есть:

    // Setup the webservice url
    QUrl serviceUrl = QUrl("http://myserver/myservice.asmx");
    QByteArray postData;

   /* 
   Setup the post data somehow
   I want to transmit:
   param1=string,
   param2=string
   */

    // Call the webservice
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
    networkManager->post(QNetworkRequest(serviceUrl), postData);

Спасибо!

Ответы [ 6 ]

120 голосов
/ 16 сентября 2011

Поскольку некоторые параметры и значения могут нуждаться в кодировке utf-8 и процентах (пробелы, &, =, специальные символы ...), лучше использовать QUrl (для Qt 4) или QUrlQuery (для Qt 5) чтобы построить опубликованную строку.

Пример кода для Qt 4 :

QUrl postData;
postData.addQueryItem("param1", "string");
postData.addQueryItem("param2", "string");
...
QNetworkRequest request(serviceUrl);    
request.setHeader(QNetworkRequest::ContentTypeHeader, 
    "application/x-www-form-urlencoded");
networkManager->post(request, postData.encodedQuery());

и для Qt 5 :

QUrlQuery postData;
postData.addQueryItem("param1", "string");
postData.addQueryItem("param2", "string");
...
QNetworkRequest request(serviceUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader, 
    "application/x-www-form-urlencoded");
networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());

Начиная с Qt 4.8, вы также можете использовать QHttpMultiPart , если вам нужно загрузить файлы.

17 голосов
/ 21 сентября 2010

Я использовал:

QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");

Так & вместо новой строки после каждого параметра.

7 голосов
/ 15 апреля 2014

Обновление ответа alexisdm на Qt5:

// Setup the webservice url
QUrl serviceUrl = QUrl("http://your.url");
QByteArray postData;

QUrl params;
QUrlQuery query;
query.addQueryItem("param1","string1");
query.addQueryItem("param2","string2");

params.setQuery(query);

postData = params.toEncoded(QUrl::RemoveFragment);

// Call the webservice
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)),
        SLOT(onPostAnswer(QNetworkReply*)));

QNetworkRequest networkRequest(serviceUrl);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");

networkManager->post(networkRequest,postData);

Не забудьте включить

QT += network

в .pro.

5 голосов
/ 21 февраля 2011

на самом деле ответ

QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");

ПРИМЕЧАНИЕ: используйте «&» здесь !!! .

Я не заметил здесь ответа Джухи и тратил много времени на тестирование моего кода с использованием подхода ", \ n".

Пожалуйста, измените правильный ответ на Джуху.

2 голосов
/ 15 ноября 2012

Вот еще один способ справиться с этим, я использую ваш код также, чтобы дать полный код:

     // Setup the webservice url         
     QUrl serviceUrl = QUrl("http://myserver/myservice.asmx");
     QByteArray postData;

     QUrl params;
     params.addQueryItem("param1","string1");
     params.addQueryItem("param2","string2");

     postData = params.encodedQuery();

     // Call the webservice
     QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
     connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));

      networkManager->post(QNetworkRequest(serviceUrl), postData);
0 голосов
/ 08 апреля 2010
QByteArray postData;
postData.append("param1=string,\n");
postData.append("param2=string\n");
...