2012-09-19 13 views
5

JSONクエリをWebサービスに送信しようとしていますが、クエリに対する応答として内部サーバーエラーが引き続き発生します。ここで QNetworkRequestを使用したHTTP POSTの正しい形式

は、私が送信しようとしているものです:、どのような方法は、行を挿入するために使用される。これは、 https://www.superService.com/api/1.7/ssapi.asmx

に送られることになっている

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"} 

QNetworkRequestの製造において

POST /api/1.7/webservice.asmx HTTP/1.1

完全なヘッダーはQNetworkRequestオブジェクトに含まれていますか?
QNetworkAccessManager :: post()メソッドでJSONデータがQNetworkRequestオブジェクトにあるのか、それとも2番目の引数としてポストに追加されるべきですか?ここで

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

    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リクエストを書くための正しい方法ではありません。次のコードはより正確です。

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 *は、 'QNetworkAccessManager :: post();'メソッドで 'serviceURL'と* POST *で指定されています。 **「低レベル」のHTTPリクエストを書く必要はありません。 Qtはあなたのためにそれを行います**。これについていくつかのチュートリアルを読むことを躊躇しないで、私はそれがあなたに非常に便利だと思う。 –

+0

私のjson文字列も正しくありませんでした。私は "メソッド"、 "パラメータ"、 "id"を渡す必要がありました。私は、 "パラメータ"オブジェクトと "id"オブジェクトが欠けていました。 jsonの良いサマリー[link](http://en.wikipedia.org/wiki/JSON-RPC#Version_1.0) – DarwinIcesurfer

関連する問題