Jak funkcjonuje GET i POST w QNetworkAccessManager Class?

0

Ktoś mógłby wyjaśnić jak zrobić najprostszy program z użyciem tej biblioteki oraz konkretnie metod GET i POST. Nie ogarniam w pełni jak to dokładnie funkcjonuje tzn. jak wykonać zapytanie i odczytać dane z odpowiedzi.

1

Sądząc po mnogości odpowiedzi to raczej każdy woli takie rzeczy obsługiwać w innych językach.
Szpecem nie jestem ale po przeanalizowaniu paru przykładów:
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=581&key=QNetworkAccessManagerDownloadFileHTTP
http://www.cppfun.com/qt-http-get-post.htm
http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php
i przejrzeniu dokumentacji:
http://doc.qt.io/qt-5/qnetworkaccessmanager.html#post
http://doc.qt.io/qt-5/qnetworkreply.html
http://doc.qt.io/qt-5/qurl.html
http://doc.qt.io/qt-5/qnetworkrequest.html
można dojść do jakichś wniosków np metoda QNetworkAccessManager::get(QNetworkRequest) zwraca wskaźnik na obiekt typu QNetworkReply i emituje dla tego obiektu sygnał readyRead(), po zakończeniu wczytywania danych obiekt emituje sygnał finished():

reply = manager->get(req);
connect(reply, SIGNAL(readyRead()), this, SLOT(urlRead()));
connect(reply, SIGNAL(finished()), this, SLOT(urlFinished()));

slot urlRead wczytuje dane typu QByteArray z obiektu reply za pomocą metody readAll (pochodzącej z klasy QIODevice po której QNetworkReply dziedziczy)

void MainWindow::urlRead()
{
    buffer += reply->readAll();
}

a w slocie urlFinished() możemy np przerobić te dane na tekst lub wpisać dane do obrazka itp itd:

void MainWindow::urlFinished()
{
    QString data(buffer);
    ui->textBrowser->setText(data);
}

Natomiast metoda post przyjmuje dwa argumenty typu QNetworkRequest i QByteArray, w QNetworkRequest ustawiamy dane strony do wysłania danych (nie znam się na tym więc tutaj nie wiem dokładnie jak to działa):

QString txt = ui->textEdit->toPlainText();
QByteArray postData;
postData.append(txt);
QNetworkRequest request = QNetworkRequest(QUrl(ui->lineEdit->text()));
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
manager->post(request, postData);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(sendFinished(QNetworkReply*)));

Teraz tutaj aby otrzymać informacje o zakończeniu wysyłania i ewentualnych błędach łączymy sygnał wysyłany przez obiekt typu QNetworkAccesManager ze slotem w którym te informacje sobie można przetworzyć:

void MainWindow::sendFinished(QNetworkReply *r)
{
    disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(sendFinished(QNetworkReply*)));
    if(r->error() == QNetworkReply::NoError)
        ui->textBrowser->setText("wysyłanie zakończone bez błędu");
    else
        ui->textBrowser->setText(QString("Błąd przy wysyłaniu: ") + r->errorString());
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1