我打算使用QNetworkAccessManager通過我的移動應用程序向服務器發送HTTP服務器的請求。問題是,如何將自定義數據鏈接到每個請求?我試圖繼承QNetworkReply,但是我發現我必須實現虛擬方法close()
和isSequential()
,但我不知道那些應該返回的內容,所以我恐怕會打破網絡請求功能。如何使QNetworkReply返回自定義數據?
例如,當我的應用程序不會在日誌中的過程,它具有存儲帳戶的電子郵件地址:
class MyApp : public QObject
{
Q_OBJECT
private:
QNetworkRequest request;
QNetworkReply *reply;
QNetworkAccessManager *manager;
...
}
void MyApp::do_log_in(QString email, QString password) {
QString s;
someobject.email=email; // <-- I have to store email address before sending request to server, but where do I store it?
s.append("http://myapp.com/do-auth.php?email=");
s.append(QUrl::toPercentEncoding(email));
s.append("&password=");
s.append(QUrl::toPercentEncoding(password));
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(login_finished(QNetworkReply*)));
request.setUrl(QUrl(s));
manager->get(request);
}
void MyApp::login_finished(QNetworkReply *rep) {
DepservReply *reply;
QString email;
....
email= ...... // <-- I need to get the email address from QNetworkReply object somehow
///my code here handling server reply
....
}
所以,我該如何實現我的情況下,電子郵件的存儲和檢索,什麼我應該繼承哪些類,並重新實現哪些方法?
有幾種方法,但您可以簡單地將json結構中的數據與結構中的請求一起返回。所以你不需要子類化任何東西。您的網絡回覆處理器可以簡單地檢查請求,以查看剩餘消息中的數據。我這樣做;我返回一個包含三部分的json結構;請求,結果代碼和數據。該請求告訴我我做了哪個調用,結果代碼告訴我它是否工作,並且數據包含結果。 –
@johnelemans,如果服務器不響應呢?如果在通話過程中連接中斷,並且必須計時,該怎麼辦?這就是爲什麼將更多數據與請求本身相關聯的原因。 – Nulik
在這種情況下,您將在請求中獲得超時。 –