code

QNetworkAccessManager를 사용하여 URL에 데이터를 게시하는 방법

codestyles 2020. 12. 27. 10:52
반응형

QNetworkAccessManager를 사용하여 URL에 데이터를 게시하는 방법


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);

감사!


나는 다음을 사용했다 :

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

따라서 각 매개 변수 다음에 개행 대신 &.


일부 매개 변수 및 값은 utf-8 및 백분율 인코딩 (공백, &, =, 특수 문자 ...)이 필요할 수 있으므로 게시 된 문자열을 빌드하려면 ( QUrlQt 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 를 사용할 수도 있습니다 .


Qt5에 대한 alexisdm 답변 업데이트 :

// 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.


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.


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);

QByteArray postData;
postData.append("param1=string,\n");
postData.append("param2=string\n");

ReferenceURL : https://stackoverflow.com/questions/2599423/how-can-i-post-data-to-a-url-using-qnetworkaccessmanager

반응형