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

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++中常用的技巧之一。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值