coreTech.code
coreTech.code

Reputation: 11

Qt 6 NetworkAccessManager error "Host requires Authentication" what can cause this error?

Everytime i make a POST request it tells me that "host requires authentication" but the API I am trying to use is a public api in laravel. GET requests are working fine and the POST request is also working fine in postman. can anyone point out my mistake?

#include "base_request.h"

BaseRequest::BaseRequest(QObject *parent) : QObject(parent)
{
    this->networkManager = new QNetworkAccessManager(this);
    connect(this->networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleFinished(QNetworkReply*)));
    // set HTTP headers
    headers["User-Agent"] = "RequestManager 1.0";
    headers["Accept"] = "application/json";
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Content-Length"] = 0;
}

void BaseRequest::HEAD(const QString hostName)

    QNetworkRequest request = this->constructNetworkRequest(hostName, this->headers);
    this->networkManager->head(request);
}

void BaseRequest::POST(const QString hostName, QMap<QString, QString> data)
{

    const QString link = BASE_URL + hostName;
    QNetworkRequest request = this->constructNetworkRequest(link, this->headers);
    QUrlQuery postData = this->constructPostData(data);
    this->networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
}

void BaseRequest::handleFinished(QNetworkReply *networkReply)
{
    networkReply->deleteLater();

    if (networkReply->error() == QNetworkReply::NoError)
    {
        qint32 httpStatusCode = networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

        // 200
        if (httpStatusCode >= 200 && httpStatusCode < 300) // OK
        {
            emit this->sendSignal(networkReply->readAll());
        }
        else if (httpStatusCode >= 300 && httpStatusCode < 400) // 300 Redirect
        {
            QUrl relativeUrl = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();

            QUrl redirectUrl = networkReply->url().resolved(relativeUrl);

            networkReply->manager()->get(QNetworkRequest(redirectUrl));

            return;
        }
        else if (httpStatusCode >= 400 && httpStatusCode < 500) // 400 Error
        {
            qDebug() << httpStatusCode << " Error!";
        }
        else if (httpStatusCode >= 500 && httpStatusCode < 600) // 500 Internal Server Error
        {
            qDebug() << httpStatusCode << " Error!";
        }
        else
        {
            qDebug() << "Status code invalid! " << httpStatusCode;
        }
    }
    else
    {
        qDebug() << "errorString: " << networkReply->errorString();
    }

    networkReply->manager()->deleteLater();
}

QUrlQuery BaseRequest::constructPostData(QMap<QString, QString> data)
{
    QUrlQuery postData;
    QMapIterator<QString, QString> iterator(data);

    while (iterator.hasNext()) {
        iterator.next();
        postData.addQueryItem(iterator.key(), iterator.value());
    }
    return postData;
}

QNetworkRequest BaseRequest::constructNetworkRequest(const QString hostName, QMap<QString, QString> headers)
{
    QNetworkRequest request;
    request.setUrl(QUrl(hostName));


    if (!headers.isEmpty()) {
        QMapIterator<QString, QString> iterator(headers);
        while (iterator.hasNext()) {
            iterator.next();
            request.setRawHeader(QByteArray::fromStdString(iterator.key().toStdString()), QByteArray::fromStdString(iterator.value().toStdString()));
        }
    }

    return request;
}

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    RequestManager manager(&a);
    QMap <QString, QString> data;
    QString hostName = "http://127.0.0.1:8000/api/login";
    data["name"] = "admin";
    data["password"] = "123";

    manager.POST(hostName, data);

    return a.exec();
}

I tried using all HTTP methods on postman and all of it are working as expected.

Upvotes: 1

Views: 572

Answers (1)

Moses Ejim
Moses Ejim

Reputation: 37

If you're trying to login, ensure your email is verified

Upvotes: 0

Related Questions