2010-04-08 14 views
46

का उपयोग करके मैं यूआरएल में डेटा कैसे पोस्ट कर सकता हूं मेरे पास एक webservice है जिसे मुझे Qt का उपयोग करने के लिए कुछ डेटा पोस्ट करने की आवश्यकता है। मुझे लगा कि वेब सेवा पर पोस्ट करते समय मैं QByteArray का उपयोग कर सकता हूं।QNetworkAccessManager

मेरा सवाल यह है कि, मैं दूसरे सिरे पर सही ढंग से पार्स करने के लिए इस सरणी को कैसे प्रारूपित कर सकता हूं?

इस कोड को मैं अब तक है:

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

धन्यवाद!

उत्तर

14

मैं प्रयोग किया है:

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

तो & बजाय न्यू लाइन प्रत्येक पैरामीटर के बाद।

+7

भी काम नहीं करता है यह दृष्टिकोण इनपुट में वर्णों और पात्रों की रक्षा नहीं करता है। यदि 'स्ट्रिंग' उपयोगकर्ता इनपुट है, तो वे पैरामीटर इंजेक्ट कर सकते हैं। – Halfgaar

-4
QByteArray postData; 
postData.append("param1=string,\n"); 
postData.append("param2=string\n"); 
+2

यह – relipse

5

वास्तव में जवाब देने

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

नोट है: का उपयोग करें "&" यहाँ !!!

मैंने जुहा के जवाब को यहां नहीं देखा, और ", \ n" दृष्टिकोण का उपयोग करके मेरे कोड का परीक्षण करने में अधिक समय बर्बाद कर दिया।

कृपया जुहा के सही उत्तर को बदलें।

101

के बाद से कुछ मानकों और मूल्यों utf-8 और प्रतिशत एन्कोडेड हो (रिक्त स्थान, &, =, विशेष वर्ण ...) आवश्यकता हो सकती है, आप बल्कि QUrl या QUrlQuery (क्यूटी 4 के लिए) (क्यूटी 5 के लिए) का उपयोग करना चाहिए पोस्ट स्ट्रिंग बनाने के लिए।

के लिए

उदाहरण कोड क्यूटी 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()); 

और के लिए क्यूटी 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()); 

क्यूटी 4.8 के साथ शुरू आप भी QHttpMultiPart उपयोग कर सकते हैं यदि आप फ़ाइलों को अपलोड करने की जरूरत है।

+7

यह प्रश्न में कार्य को पूरा करने का सबसे निश्चित तरीका है। +1। –

+2

क्यूटी 5 के रूप में, QUrl में अब addQueryItem() नहीं है। – mjk99

+1

@ mjk99 'QUrlQuery' करता है, लेकिन इसमें' .encodedQuery() ' – JVE999

2

यहाँ एक और तरीका यह संभाल करने के लिए है, मैं अपने कोड का उपयोग कर रहा भी एक पूरा कोड देने के लिए:

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

Qt5 को alexisdm जवाब अपडेट कर रहा है:

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

+1

यह कोड अलग-अलग करता है कि केवल जुहा की तरह QByteArray का निर्माण करना, यह है कि पोस्टडेटा '?" Param1 = string1 और param2 = string2 "' है, जो गलत हो जाता है। – Halfgaar

+1

यदि आप एक ही नेटवर्क एक्सेस मैनेजर का उपयोग करके एकाधिक अनुरोध कर रहे हैं, तो स्लॉट को 'QNetworkAccessManager' के बजाय 'QNetworkReply' के' समाप्त() 'सिग्नल से कनेक्ट करना समझदारी है। इस तरह, आप प्रति अनुरोध अलग-अलग सिग्नल प्राप्त कर सकते हैं और उन्हें अलग-अलग संभाल सकते हैं, या 'readyRead() 'सिग्नल का उपयोग कर भाग द्वारा डेटा भाग को संभाल सकते हैं। – nurettin

संबंधित मुद्दे