我正在尝试将JSON查询发送到Web服务,并且继续收到内部服务器错误作为对该查询的响应。
这是我要发送的内容:
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"}
这应该发送到 https://www.superService.com/api/1.7/ssapi.asmx
在准备时QNetworkRequest,使用什么方法插入行
QNetworkRequest
POST /api/1.7/webservice.asmx HTTP / 1.1 ?
QNetworkRequest对象中是否包含完整的标头? JSON数据应该在QNetworkRequest对象中还是作为方法中的第二个参数添加到帖子中QNetworkAccessManager::post()?
QNetworkAccessManager::post()
这是我当前在on_btnLogin_clicked()插槽中的代码:
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("\"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("\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());
这不是编写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\":\"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);