我需要在我的Qt应用程序中向服务器发出HTTP POST请求。
POST请求将包含一系列命名值,即键/值对。它们大多数是字母数字字符串,但可能包含引号、空格等特殊字符。
在Qt中执行此类型的POST请求的规范方式是什么?
当前的答案适用于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());
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声明的父对象传递)
你可以使用QNetworkAccessManager和QNetworkRequest一起发送http请求。
如果你想要发送键值对,考虑使用JSON。
manager->post(resource, params.encodedQuery());
处遇到了一个错误,看起来post()
需要一个QNetworkRequest
。将其更改为manager->post(QNetworkRequest(resource), params.encodedQuery());
即可解决问题。 - sashoalmdeleteLater()
http://qt-project.org/doc/qt-4.8/qnetworkaccessmanager.html#finished。 - epsilonparams.encodedQuery
返回一个QByteArray
)。但通常对于表单上的HTTP POST请求,您的浏览器会设置Content-Type
为application/x-www-form-urlencoded
。我编辑了我的帖子以向您展示一个例子;) - epsilon