Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

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":"[email protected]","password":"mypass"}

This is supposed to be sent to https://www.superService.com/api/1.7/ssapi.asmx

In preparing the QNetworkRequest, what method is used to insert the line

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

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?

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\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());
like image 280
DarwinIcesurfer Avatar asked Sep 19 '12 02:09

DarwinIcesurfer


1 Answers

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\":\"[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);
like image 103
air-dex Avatar answered Oct 29 '22 11:10

air-dex