2010-12-08 8 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動詞に対して1つの関数を作成することです。

これが私のポスト機能(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

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); 
関連する問題