Qt中写post请求函数如何直接输入url和body参数(字符串列表)获取数据

文章介绍了如何在Qt环境中编写一个函数来发送POST请求,其中包含JSON格式的数据,特别是如何处理字符串列表作为参数。使用std::initializer_list来传递字符串数组,并展示了如何将这些数据转化为QJsonObject,然后发送HTTPPOST请求。示例代码包括了单个字符串列表和二维字符串数组两种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt中写post请求函数如何直接输入url和body参数(字符串列表)获取数据
类似这样的要求:
在发送post请求里封装json数据,json数据类似于

"name":["Alice","Tom","Kitty","Ben"]
"absent":false

其中name和absent是参数名需要提前分装在json数据里,三个参数分别是字符串url,字符串数组name,bool类型的absent,调用时直接写类似如下:

sendPostRequest("http://example.com/api", {"Alice","Tom","Kitty","Ben"},false);

难点

在C++中,直接将花括号中的字符串列表作为参数传递是不允许的,需要使用初始化列表或者std::initializer_list。可以将字符串列表作为std::initializer_list参数,然后在函数内将其转换为QStringList类型,再调用sendPostRequest函数。

关于std::initializer_list
std::initializer_list是C++11中的一个新特性,用于在函数中传递任意数目的参数列表,类似于C语言中的可变参数列表。它可以像数组一样使用下标访问其中的元素,也可以使用begin和end函数遍历其中的元素,还可以进行迭代器的操作。std::initializer_list类型的参数可以接收多个参数,这些参数可以是相同类型或者不同类型,但必须在调用函数时用花括号括起来。例如:

void print(std::initializer_list<int> args)
{
    for (auto it = args.begin(); it != args.end(); ++it) {
        std::cout << *it << " ";
    }
}

int main()
{
    print({1, 2, 3}); // 调用print函数,并传递参数列表{1, 2, 3}
    return 0;
}

在上面的代码中,我们定义了一个print函数,它的参数类型为std::initializer_list,可以接收任意数目的int类型参数。在main函数中,我们调用print函数,并使用花括号括起来的参数列表{1, 2, 3}作为参数传递给print函数。print函数会遍历这个参数列表,并输出每个元素的值。

具体实现代码

在sendPostRequest函数中,首先创建一个QJsonObject对象,并为其添加属性,然后将其转换为json字符串作为post请求的body参数发送。

#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QString>

//发送post请求
void sendPostRequest(QString url, std::initializer_list<QString> name, bool absent)
{
    QNetworkAccessManager* manager = new QNetworkAccessManager(this);
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    QJsonArray jsonArray;
    for (auto value : name) {
        jsonArray.append(QJsonValue(value));
    }

    QJsonObject jsonObject;
    jsonObject["name"] = jsonArray;
    jsonObject["absent"] = absent;

    QJsonDocument jsonDoc(jsonObject);
    QByteArray bodyData = jsonDoc.toJson(QJsonDocument::Compact);

    QNetworkReply* reply = manager->post(request, bodyData);

    // 处理reply的响应数据
}

// 调用示例
sendPostRequest("http://example.com/api", {"Alice","Tom","Kitty","Ben"}, false);

变式:输入的body参数是字符串数组的数组

假设以小组为单位统计该组是否都出席,json数据类似于:

"name":[
	   ["Alice","Tom","Kitty","Ben"],
	   ["David","Lucy","Sam","Lily"]
]
"absent":false

此时的代码如下:

#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QString>

void sendPostRequest(QString url, const std::vector<std::vector<QString>>& name, bool absent)
{
    QNetworkAccessManager* manager = new QNetworkAccessManager(this);
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    QJsonArray jsonArray1;
    for (const auto& value1 : name) {
        QJsonArray jsonArray2;
        for (const auto& value2 : value1) {
            jsonArray2.append(QJsonValue(value2));
        }
        jsonArray1.append(jsonArray2);
    }

    QJsonObject jsonObject;
    jsonObject["a"] = jsonArray1;
    jsonObject["b"] = absent;

    QJsonDocument jsonDoc(jsonObject);
    QByteArray bodyData = jsonDoc.toJson(QJsonDocument::Compact);

    QNetworkReply* reply = manager->post(request, bodyData);

    // 处理reply的响应数据
}

// 调用示例
sendPostRequest("http://example.com/api", {{"Alice","Tom","Kitty","Ben"}, {"David","Lucy","Sam","Lily"}}, false);

这里的const std::vector<std::vector<QString>>& name是一个引用类型参数,表示传递给sendPostRequest函数的第一个参数,类型是std::vector<std::vector<QString>>,即一个字符串类型的二维数组。

引用类型参数的作用是可以直接传递一个变量或对象的引用(地址),避免了拷贝对象的开销,同时也可以让函数修改原变量或对象的值,而不是产生一个新的副本。在这个例子中,我们的目的是将字符串类型的二维数组封装成json数据,并发送post请求,因此使用引用类型参数可以避免拷贝二维数组的开销,提高程序的效率。

此外,为了保证name参数不被修改,我们使用了const关键字对其进行了常量引用声明,表示在函数中不能修改name参数的值。

总之,引用类型参数可以提高程序的效率,同时也可以让函数修改原变量或对象的值,而不是产生一个新的副本,是C++中常用的技巧之一。

Qt中使用QHttpMultiPart向服务器发送HTTP POST请求并携带multipart/form-data类型的表单数据时,你需要按照以下步骤设置包含boundary: 1. **创建QHttpMultiPart对象**: 首先,创建一个`QHttpMultiPart`对象,表示多部分上传的数据。你可以选择特定的边界值,比如生成一个随机字符串,作为边界标识,因为HTTP头会包含这个值。 ```cpp QString boundary = "your-boundary-string"; // 替换为你想要的任意字符串,通常包含随机字符 QHttpMultiPart multiPart(QHttpMultiPart::FormDataType, boundary); ``` 2. **添加部分(parts)**: 对于每个需要上传的文件或表单字段,你需要创建一个`QHttpPart`对象,并指定其类型(如`QHttpPart::Header`, `QHttpPart::BinaryData`, 或 `QHttpPart::Text`)。例如,处理一个文件: ```cpp QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"")); filePart.setBody(fileToUpload); // 替换为你要上传的文件指针 multiPart.append(filePart); ``` 对于文本或其他类型的数据,同样设置头部信息正文。 3. **设置请求体**: 使用`setBody()`方法将`QHttpMultiPart`对象添加到请求体中。这里要传递整个`multiPart`。 ```cpp QByteArray requestPayload = multiPart.toByteStream(); QHttpRequestHeader header; header.setRawHeader("Content-Type", "multipart/form-data; boundary=" + boundary); yourQHttpRequest.setHeader(header); yourQHttpRequest.setRequestBody(requestPayload); ``` 4. **发送请求**: 最后,你可以使用`send()`函数发送这个带有多部分数据的请求。 注意:在实际操作中,你需要确保生成的boundary字符串不会在服务器端与已存在的头部冲突。另外,记得处理可能出现的网络错误服务器响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值