在Qt中使用命名参数列表进行HTTP POST请求

3

我需要在我的Qt应用程序中向服务器发出HTTP POST请求。

POST请求将包含一系列命名值,即键/值对。它们大多数是字母数字字符串,但可能包含引号、空格等特殊字符。

在Qt中执行此类型的POST请求的规范方式是什么?

3个回答

9

当前的答案适用于Qt 4。对于Qt 5,语法已经改变,应该如下所示:

QUrlQuery params;

params.addQueryItem("key1", "value1");
params.addQueryItem("key2", "value2");

QUrl resource("http://server.com/form.php");
QNetworkAccessManager* manager = new QNetworkAccessManager(this);

connect(manager, SIGNAL(finished(QNetworkReply*)), this, 
SLOT(handleEndOfRequest(QNetworkReply*)));

QNetworkRequest request(resource);
//Force Content-Type header
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

manager->post(request, params.query(QUrl::FullyEncoded).toUtf8());

一些背景信息: http://doc.qt.io/qt-5/qurl-obsolete.html 关于如何制作Qt版本感知代码的说明在这里: 如何将QUrl addQueryItem移植到Qt5的QUrlQuery?

4
QUrl params;

params.addQueryItem("key1", "value1");
params.addQueryItem("key2", "value2");

QUrl resource("http://server.com/form.php");
QNetworkAccessManager* manager = new QNetworkAccessManager(this);

connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleEndOfRequest(QNetworkReply*)));

QNetworkRequest request(resource);
//Force Content-Type header
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

manager->post(request, params.encodedQuery());

这段代码假设您的当前对象是一个QObject(作为QNeworkAccessManager和slots声明的父对象传递)


嗯,我在manager->post(resource, params.encodedQuery());处遇到了一个错误,看起来post()需要一个QNetworkRequest。将其更改为manager->post(QNetworkRequest(resource), params.encodedQuery());即可解决问题。 - sashoalm
@sashoalm 不要忘记在 handleEndOfRequest 槽函数中清理 QNetworkReply!否则会导致内存泄漏。 - Kurt Pattyn
完全正确@sashoalm,我进行了编辑以纠正这个遗漏。 - epsilon
@KurtPattyn:你对删除concern的做法是正确的,但文档建议使用deleteLater()http://qt-project.org/doc/qt-4.8/qnetworkaccessmanager.html#finished。 - epsilon
这似乎是正常的,因为Qt将参数视为字节流(params.encodedQuery返回一个QByteArray)。但通常对于表单上的HTTP POST请求,您的浏览器会设置Content-Typeapplication/x-www-form-urlencoded。我编辑了我的帖子以向您展示一个例子;) - epsilon
显示剩余4条评论

0

你可以使用QNetworkAccessManager和QNetworkRequest一起发送http请求。
如果你想要发送键值对,考虑使用JSON。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接