2010-02-06 40 views
30

如何使用Qt 4.6.1創建帶有一些URL編碼參數的HTTP POST請求?如何使用Qt 4.6.1創建HTTP POST請求?

我發現我可以創建一個QNetworkRequest,在那裏設置所有參數並通過QNetworkAccessManagers post方法發送它。但是,我怎樣才能向請求添加一些URL編碼參數?

最後我想訪問使用Qt/C++的Eve API。一個Python的例子可以在這裏找到: http://www.eveonline.com/api/doc/example-python.asp


我設法它使用類似(有待重構,並形成一些有用的東西):

QNetworkReply *requestApi(QNetworkAccessManager &nwam) 
{ 

    QNetworkRequest request(QUrl("http://api.eve-online.com/account/Characters.xml.aspx")); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); 

    QByteArray data; 
    QUrl params; 

    params.addQueryItem("userid","user"); 
    params.addQueryItem("apiKey","key"); 
    data.append(params.toString()); 
    data.remove(0,1); 

    QNetworkReply *reply = nwam.post(request,data); 
    return reply; 
} 
+0

[QUrl :: addEncodedQueryItem()](http://doc.trolltech.com/4.6/qurl.html#addEncodedQueryItem)?我自己使用Qt,但還沒有使用過很多的HTTP部分。 – Macke 2010-02-07 16:32:35

+0

對於您的使用情況來說,QNetworkAccessManager看起來像是過度殺毒。爲什麼不使用libcurl? – Paladin 2015-06-22 15:23:55

回答

6

對不起,我只能找到你的帖子遲到了。 但是,如果其他人正在尋找答案,我仍會盡力提供幫助。

由於意外,我也在研究一個EVE API應用程序,我也嘗試了同樣的方法。不幸的是,QNetworkManager不能這樣工作,因爲它異步發佈請求。您必須將插槽連接到其finished(QNetworkReply*)信號。

我通過與稱爲EveConnector一個單獨的類的請求時,處理在連接到QNetworkManagerfinished信號的時隙中的應答,然後調用返回穿過連接器類的自己的信號發出請求的對象做到這一點。

如果你問,我會高興地分享代碼。

11

您的解決方案几乎是正確的。但是,應該使用:的

data = params.encodedQuery(); 

代替

data.append(params.toString()); 
data.remove(0,1); 

妥善處理UTF8字符串。