How can I POST data to a url using QNetworkAccessManager

后端 未结 6 1754
北荒
北荒 2020-11-30 22:33

I have a webservice that I need to POST some data to using Qt. I figured that I can use a QByteArray when POSTing to the web service.

My question is, how can I forma

相关标签:
6条回答
  • 2020-11-30 22:44

    I used:

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

    So & instead of newline after each parameter.

    0 讨论(0)
  • 2020-11-30 22:45

    Here is another way to handle this, i am using your code also to give a complete code:

         // 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 讨论(0)
  • 2020-11-30 22:47

    the actually answer is

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

    NOTE: use "&" here!!!.

    I didn't notice Juha's answer here, and waste much time on testing my code using the ",\n" approach.

    Please change the correct answer to Juha's.

    0 讨论(0)
  • 2020-11-30 22:58
    QByteArray postData;
    postData.append("param1=string,\n");
    postData.append("param2=string\n");
    
    0 讨论(0)
  • 2020-11-30 23:04

    Since some parameters and values might need to be utf-8 and percent encoded (spaces, &, =, special chars...), you should rather use QUrl (for Qt 4) or QUrlQuery (for Qt 5) to build the posted string.

    Example code for 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());
    

    and for 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());
    

    Starting with Qt 4.8 you can also use QHttpMultiPart if you need to upload files.

    0 讨论(0)
  • 2020-11-30 23:06

    Updating alexisdm answer to Qt5:

    // Setup the webservice url
    QUrl serviceUrl = QUrl("http://your.url");
    QByteArray postData;
    
    QUrlQuery query;
    query.addQueryItem("param1","string1");
    query.addQueryItem("param2","string2");
    
    postData = query.toString(QUrl::FullyEncoded).toUtf8();
    
    // 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);
    

    Don't forget to include

    QT += network
    

    in .pro.

    0 讨论(0)
提交回复
热议问题