Qt 6 NetworkAccessManager 错误“主机需要身份验证”什么会导致此错误?

问题描述 投票:0回答:1

每次我发出 POST 请求时,它都会告诉我“主机需要身份验证”,但 API 我正在尝试使用 Laravel 中的公共 api。 GET 请求工作正常,POST 请求在邮递员中也工作正常。谁能指出我的错误吗?

#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;
}

主.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();
}

我尝试在邮递员上使用所有 HTTP 方法,所有这些方法都按预期工作。

c++ laravel qt httprequest qnetworkaccessmanager
1个回答
0
投票

如果您尝试登录,请确保您的电子邮件已验证

© www.soinside.com 2019 - 2024. All rights reserved.