2010-12-08 101 views
1

任何人都可以指向我使用Qt4调用REST服务的简单方法吗?我找不到有关如何做到这一点的任何体面的文档。现在我有这样的东西:使用Qt4调用REST服务

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

回答

2

你的功能接近调用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))); 
} 
+0

这非常接近。我添加了我的调用代码,以便您可以看到我想要做的事情。 – Kyle 2010-12-09 13:35:32

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);