問(wèn)題描述
我正在嘗試向 Web 服務(wù)發(fā)送 JSON 查詢,但我繼續(xù)收到內(nèi)部服務(wù)器錯(cuò)誤作為對(duì)查詢的響應(yīng).
I'm trying to send a JSON query to a web service and I continue to get internal server errors as a response to the query.
這是我要發(fā)送的內(nèi)容:
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":"username@domain.com","password":"mypass"}
這應(yīng)該發(fā)送到 https://www.superService.com/api/1.7/ssapi.asmx
在編寫(xiě)QNetworkRequest
時(shí),用什么方法插入行
In preparing the QNetworkRequest
, what method is used to insert the line
POST/api/1.7/webservice.asmx HTTP/1.1?
QNetworkRequest
對(duì)象中是否包含完整的標(biāo)頭?
JSON 數(shù)據(jù)應(yīng)該在 QNetworkRequest
對(duì)象中,還是作為 QNetworkAccessManager::post()
方法中的第二個(gè)參數(shù)添加到帖子中?
Is the complete header contained in the QNetworkRequest
object?
Should the JSON data be in the QNetworkRequest
object or is that added to the post as the second argument in the QNetworkAccessManager::post()
method?
這是我當(dāng)前在 on_btnLogin_clicked()
槽中的代碼:
Here is my current code in the on_btnLogin_clicked()
slot:
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
").toUtf8());
baseString.append(QString("www.superService.com
").toUtf8());
baseString.append(QString("User-Agent: My app name v0.1
").toUtf8());
baseString.append(QString("X-Custom-User-Agent: My app name v0.1
").toUtf8());
baseString.append(QString("Content-Type: application/json
").toUtf8());
QString jsonString = QString("{");
jsonString.append(""method":");
jsonString.append(""AuthenticatePlain"");
jsonString.append(","loginName":");
jsonString.append(""username@domain.com"");
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("
").toUtf8();
baseString.append(QString("
").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());
推薦答案
這不是編寫(xiě) HTTP 請(qǐng)求的正確方法.下面這段代碼更正確:
This is not the right way to write your HTTP request. The following piece of code is more correct :
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":"username@domain.com","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);
這篇關(guān)于使用 QNetworkRequest 的 HTTP POST 正確格式的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!