I'm using the code below to make a http request:

QNetworkReply* ApiRequest::req(QString url, QString method, QByteArray data) {
    QByteArray request_method = method.toUtf8();
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    QNetworkRequest request("http://127.0.0.1:9090" + url);
    request.setRawHeader("Content-Type", "application/json");
    QNetworkReply* reply = manager->sendCustomRequest(request, request_method, data);
    return reply;
}

void ApiRequest::requestConfig()
{
    NetworkReply* reply = req("/configs",
        "GET",
        "");
}

The Remote server did execute the request and reply a 204 code.
I have used wireshark to capture and make sure it had reply a 204 No Content.
However, the output there is QVariant(Invalid), the toInt output is 0.
I tried to change PUT to GET but it still not working.


You are analyzing the state even when the request has not been made so it is valid that the result is null, what you should do is analyze it when the finished signal is emitted:

QNetworkReply* reply = mg->sendCustomRequest(request, "PUT", "....some json....");
connec(reply, &QNetworkReply::finished, [reply](){
    qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
});

Update:

connec(mg, &QNetworkAccessManager::finished, [](QNetworkReply *reply){
    qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
});

Update 2:

Is there a way to return that reply when it is finished?

Yes, use a QEventLoop, but in general it is a bad design since you should use signals and slots to notify you of the changes.

QNetworkReply* ApiRequest::req(const QString & url, const QString & method, const QByteArray & data) {
    QByteArray request_method = method.toUtf8();
    QNetworkAccessManager manager;
    QNetworkRequest request("http://127.0.0.1:9090" + url);
    request.setRawHeader("Content-Type", "application/json");
    QNetworkReply* reply = manager.sendCustomRequest(request, request_method, data);
    QEventLoop loop;
    connec(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();
    return reply;
}

// ...

void ApiRequest::requestConfig()
{
    QNetworkReply* reply = req("/configs", "GET", "");
    // ...
    reply->deleteLater();
}