简体   繁体   English

使用Qt中的命名参数列表发出HTTP POST请求

[英]Make HTTP POST request with a list of named parameters in Qt

I need to make an HTTP POST request to a server from my Qt application. 我需要从Qt应用程序向服务器发出HTTP POST请求。

The POST request would contain a list of named values, ie key/value pairs. POST请求将包含一个命名值列表,即键/值对。 They will be mostly alphanumeric strings, but can contain special characters such as quotes, spaces, etc. 它们主要是字母数字字符串,但可以包含特殊字符,例如引号,空格等。

What is the canonical way of doing this type of POST request in Qt? 在Qt中执行此类POST请求的规范方法是什么?

The current answer works for Qt 4. Syntax has changed for Qt 5 and would look like this: 当前答案适用于Qt4。语法已针对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());

Some background information: http://doc.qt.io/qt-5/qurl-obsolete.html 一些背景信息: http : //doc.qt.io/qt-5/qurl-obsolete.html

Making Qt-version-aware code is described here: How do you port QUrl addQueryItem to Qt5's QUrlQuery? 此处描述制作Qt版本的代码: 如何将QUrl addQueryItem移植到Qt5的QUrlQuery?

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());

This code assumes that your current object is a QObject (passed as a parent for QNeworkAccessManager and slots declaration) 此代码假定您当前的对象是QObject(作为QNeworkAccessManager和slot声明的父级传递)

You can use QNetworkAccessManager together with QNetworkRequest to post http requests. 您可以将QNetworkAccessManager与QNetworkRequest一起使用来发布http请求。
If you want to send key/value pairs, consider using JSON. 如果要发送键/值对,请考虑使用JSON。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM