Вызов служб REST с помощью Qt4

Может ли кто-нибудь указать мне простой способ совершать звонки в службу REST с помощью Qt4? Я не могу найти достойную документацию о том, как это сделать. Сейчас у меня есть что-то вроде:

int NetworkClient::attemptLogin( QString username, QString password, int & error ) {

  QNetworkAccessManager *manager = new QNetworkAccessManager(this);

  QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(slotRequestFinished(QNetworkReply *)));

  QNetworkRequest request;
  request.setUrl(QUrl("http://192.168.20.155:3000/api/rest/user?id=" + username));
  request.setHeader(QNetworkRequest::ContentTypeHeader, "text/xml");

  QNetworkReply *reply = 0;
  reply = manager->get(request);

  qDebug() << reply;

Я хоть близко?

Вот мой код вызова:

void LoginWindow::attemptLogin() {
  int loginError;

  QString username = usernameField->text();
  QString password = passwordField->text();

  int minutes = net.attemptLogin( username, password, loginError );

  if ( minutes ) {
    attemptLoginSuccess( username, password, minutes );
  } else {
    attemptLoginFailure( loginError );
  }
}

person Kyle    schedule 08.12.2010    source источник


Ответы (3)


Вот мой вывод...

QNetworkReply* Gateway::performPost(QString service, QMap<QString, QString>params)
{
    qDebug() << QString("Post with params #").append(service) << params;

    //Initialize uri
    QString uri = Gateway::SERVICE_BASE_URI;
    QNetworkAccessManager oManager;

    //Connect signal
    connect(oManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));

    //Construct request
    QUrl res = QUrl(
        uri.append(service)
    );

    QUrl query;

    QMapIterator<QString, QString> i(params);
    while(i.hasNext()) {
        i.next();
        query.addEncodedQueryItem(QUrl::toPercentEncoding(i.key()), QUrl::toPercentEncoding(i.value()));
    }

    //Do request
    QNetworkRequest postRequest = QNetworkRequest(res);

    //Return QNetworkReply Object   
    return oManager.post(postRequest, query.encodedQuery());
}


//Implementation
QMap<QString,QString> map;

map.insert("foo", "bar");
map.insert("bar", "foo");

//Perform the POST request
oGateway.performPost("foo/bar", map);
person Christophe Eblé    schedule 09.12.2010

Ваша функция близка к той, которую я использую при вызове служб REST. Что я делаю, так это создаю одну функцию для каждого HTTP-глагола.

Это моя почтовая функция (обратите внимание на поддержку SSL и базовой авторизации)

void Http::post(QString &url, QString &user, QString &password, QString &data)
{
    QSslConfiguration config(QSslConfiguration::defaultConfiguration());

    QNetworkRequest request;


    request.setSslConfiguration(config);

    request.setRawHeader("Authorization", "Basic " +
                         QByteArray(QString("%1:%2").arg(user).arg(password).toAscii().toBase64())
                     );
    request.setRawHeader("Accept", "application/xml");
    request.setRawHeader("Content-Type", "application/xml");

    request.setUrl(QUrl(url));

    qDebug() << url;

    connect(netManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));

    reply = netManager->post(request, data.toAscii());

    connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SIGNAL(progress(qint64,qint64)));
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslError(QList<QSslError>)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(networkError(QNetworkReply::NetworkError)));
}
person Raphael    schedule 08.12.2010
comment
Это очень близко. Я добавил свой код вызова, чтобы вы могли видеть, что я пытаюсь сделать. - person Kyle; 09.12.2010

Вот как я в итоге решил свою проблему: ://bitbucket.org/libki-kms/libki-client/src/917e8201c997a9f37b57420c0df68c8751527f2a/networkclient.cpp?at=master

Спасибо за помощь всем!

person Kyle    schedule 24.06.2014