简体   繁体   English

使用QNetworkRequest更正HTTP POST的格式

[英]Correct format for HTTP POST using QNetworkRequest

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. 我正在尝试向Web服务发送JSON查询,并继续将内部服务器错误作为对查询的响应。

Here is what I'm trying to send: 这是我要发送的内容:

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

This is supposed to be sent to https://www.superService.com/api/1.7/ssapi.asmx 这应该发送到https://www.superService.com/api/1.7/ssapi.asmx

In preparing the QNetworkRequest , what method is used to insert the line 在准备QNetworkRequest ,使用什么方法来插入行

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

Is the complete header contained in the QNetworkRequest object? QNetworkRequest对象中是否包含完整的标头?
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? JSON数据应该在QNetworkRequest对象中,还是作为QNetworkAccessManager::post()方法中的第二个参数添加到帖子中?

Here is my current code in the on_btnLogin_clicked() slot: 这是我在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());

This is not the right way to write your HTTP request. 这不是编写HTTP请求的正确方法。 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM