2010-02-06 91 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字符串。