2012-09-19 6 views
5

का उपयोग कर HTTP पोस्ट के लिए सही प्रारूप मैं वेब सेवा के लिए JSON क्वेरी भेजने की कोशिश कर रहा हूं और मुझे क्वेरी के जवाब के रूप में आंतरिक सर्वर त्रुटियां मिलती रहती हैं।QNetworkRequest

यहाँ है कि मैं क्या भेजने के लिए कोशिश कर रहा हूँ है:

POST /api/1.7/webservice.asmx HTTP/1.1 
Host: www.superService.com 
User-Agent: My app name v0.1 
X-Custom-User-Agent: My app name v0.1 
Content-Type: application/json 
Content-Length:81 

{"method":"AuthenticatePlain","loginName":"[email protected]","password":"mypass"} 

यह https://www.superService.com/api/1.7/ssapi.asmx

के लिए भेजा जाना माना जाता है QNetworkRequest की तैयारी में, क्या विधि लाइन डालने के लिए प्रयोग किया जाता है

पोस्ट /पीआई/1.7/webservice.asmx HTTP/1.1?

क्या QNetworkRequest ऑब्जेक्ट में निहित पूर्ण शीर्षलेख है?
क्या JSON डेटा QNetworkRequest ऑब्जेक्ट में होना चाहिए या क्या QNetworkAccessManager :: post() विधि में दूसरे तर्क के रूप में पोस्ट में जोड़ा गया है?

connect(m_qnam, SIGNAL(finished(QNetworkReply*)), 
       this, SLOT(handleNetworkData(QNetworkReply*))); 
    connect(m_qnam,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), 
       this, SLOT(handleSSLErrors(QNetworkReply*))); 

    QString baseString = ""; 
    baseString.append(QString("POST /api/1.7/webservice.asmx HTTP/1.1\r\n").toUtf8()); 
    baseString.append(QString("www.superService.com\r\n").toUtf8()); 
    baseString.append(QString("User-Agent: My app name v0.1\r\n").toUtf8()); 
    baseString.append(QString("X-Custom-User-Agent: My app name v0.1\r\n").toUtf8()); 
    baseString.append(QString("Content-Type: application/json\r\n").toUtf8()); 

    QString jsonString = QString("{"); 
    jsonString.append("\"method\":"); 
    jsonString.append("\"AuthenticatePlain\""); 
    jsonString.append(",\"loginName\":"); 
    jsonString.append("\"[email protected]\""); 
    jsonString.append(",\"password\":"); 
    jsonString.append("\"mypass\""); 
    jsonString.append("}"); 

    QByteArray json = jsonString.toUtf8(); 

    baseString.append(QString("Content-Length:").toUtf8()); 
    baseString.append(QString::number(json.length())); 
    baseString.append("\r\n").toUtf8(); 
    baseString.append(QString("\r\n").toUtf8()); 
    baseString.append(json); 

    request = QNetworkRequest(QUrl("https://www.superService.com/api/1.7/ssapi.asmx")); 
    request.setRawHeader() 


    qDebug() << "Base String: "<< baseString; 


    m_qnam->post(request,baseString.toUtf8()); 

उत्तर

11

यह सही तरीके से अपने HTTP अनुरोध लिखने के लिए नहीं है:

यहाँ on_btnLogin_clicked() स्लॉट में मेरे वर्तमान कोड है। कोड का निम्नलिखित भाग अधिक सही है:

connect(m_qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleNetworkData(QNetworkReply*))); 
connect(m_qnam,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(handleSSLErrors(QNetworkReply*))); 

// Build your JSON string as usual 
QByteArray jsonString = "{\"method\":\"AuthenticatePlain\",\"loginName\":\"[email protected]\",\"password\":\"mypass\"}"; 

// For your "Content-Length" header 
QByteArray postDataSize = QByteArray::number(jsonString.size()); 

// Time for building your request 
QUrl serviceURL("https://www.superService.com/api/1.7/ssapi.asmx"); 
QNetworkRequest request(serviceURL); 

// Add the headers specifying their names and their values with the following method : void QNetworkRequest::setRawHeader(const QByteArray & headerName, const QByteArray & headerValue); 
request.setRawHeader("User-Agent", "My app name v0.1"); 
request.setRawHeader("X-Custom-User-Agent", "My app name v0.1"); 
request.setRawHeader("Content-Type", "application/json"); 
request.setRawHeader("Content-Length", postDataSize); 

// Use QNetworkReply * QNetworkAccessManager::post(const QNetworkRequest & request, const QByteArray & data); to send your request. Qt will rearrange everything correctly. 
QNetworkReply * reply = m_qnam->post(request, jsonString); 
+0

त्वरित प्रतिक्रिया के लिए धन्यवाद! क्या रेखा _italic_POST /api/1.7/webservice.asmx HTTP/1.1 _italic_ अनावश्यक है, या अनुरोध में इसे कैसे सम्मिलित किया जाएगा? – DarwinIcesurfer

+2

यह अनावश्यक है। */api/1.7/webservice.asmx * 'serviceURL' और * POST * के साथ' QNetworkAccessManager :: पोस्ट(); विधि के साथ निर्दिष्ट है। ** आपको "निम्न स्तर" HTTP अनुरोध लिखना नहीं है। क्यूटी आपके लिए यह करेगा **। इसके बारे में कुछ ट्यूटोरियल पढ़ने में संकोच न करें, मुझे लगता है कि यह आपके लिए बहुत उपयोगी होगा। –

+0

मेरी जेसन स्ट्रिंग भी गलत थी। मुझे "विधि", "पैरामीटर" और "आईडी" पास करने की आवश्यकता थी। मैं "पैरामीटर" ऑब्जेक्ट और "आईडी" ऑब्जेक्ट खो रहा था। यहां जेसन का एक अच्छा सारांश [लिंक] (http://en.wikipedia.org/wiki/JSON-RPC#Version_1.0) – DarwinIcesurfer

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

  • कोई संबंधित समस्या नहीं^_^