【问题标题】:How can I POST data to a url using QNetworkAccessManager如何使用 QNetworkAccessManager 将数据发布到 url
【发布时间】:2011-02-05 15:57:45
【问题描述】:

我有一个网络服务,我需要发布一些数据以使用 Qt。 我想我可以在 POST 到 Web 服务时使用 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);

谢谢!

【问题讨论】:

    标签: web-services qt post symbian


    【解决方案1】:

    由于某些参数和值可能需要 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

    【讨论】:

    【解决方案2】:

    我用过:

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

    所以 & 而不是每个参数后的换行符。

    【讨论】:

    • 这种方法不能防止 & 字符出现在输入中。如果'string'是用户输入,他们可以注入参数。
    【解决方案3】:

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

    别忘了包含

    QT += network
    

    在.pro中。

    【讨论】:

    • 这段代码与仅仅构造一个像 Juha 这样的 QByteArray 不同的是,postData 是"?param1=string1&param2=string2",这是错误的。
    • 如果您使用同一个网络访问管理器执行多个请求,则将插槽连接到QNetworkReplyfinished() 信号而不是QNetworkAccessManager 是有意义的。这样,您可以为每个请求提供不同的信号并分别处理它们,或者使用readyRead() 信号部分处理数据。
    【解决方案4】:

    真正的答案是

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

    注意:这里使用“&”!!!

    我没有注意到 Juha 在这里的回答,并且浪费了很多时间来使用 ",\n" 方法测试我的代码。

    请把正确答案改成Juha的。

    【讨论】:

      【解决方案5】:

      这是另一种处理方法,我正在使用您的代码来提供完整的代码:

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

      【讨论】:

        【解决方案6】:
        QByteArray postData;
        postData.append("param1=string,\n");
        postData.append("param2=string\n");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-05
          • 1970-01-01
          相关资源
          最近更新 更多