Qt http post 表单访问数据——Qt

前言

我之前只用QNetworkAccessManager进行我最常见的http访问,即访问头是"application/json",这种格式的。而现在同事给我的服务是http表单格式的,因为他们主要给Web前端提供服务,所以我就只好调整自己的格式设置了。

 

说明和代码

表单的发包方式有两种:application/x-www-form-urlencoded是最常用的表单发包方式,普通的表单提交,或者js发包,默认都是通过这种方式;如果需要传输文件,则就用到了multipart/form-data了,这种方式这篇博客先不说,因为我也还没用到。

现在以application/x-www-form-urlencoded方式发包,比如需要查询type1=1同时type2=2的数据,就需要设置form-data,键值对用&进行分隔(type1=1&type2=2)。

不同的访问方式对于form-data的处理不同:

若是get,则是将这个字符串(name1=value1&name2=value2…)用?分割,加到url的后面,组成新的url进行访问;

若是post,form-data就会被封装到 http body中,然后发送给服务器。

   QString post_data="type1=1&type2=2";

    QNetworkRequest requst;
    //QString header="application/json";
    QString header="application/x-www-form-urlencoded";
    requst.setHeader(QNetworkRequest::ContentTypeHeader,header);
    requst.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());

    requst.setUrl(QUrl(url));
    QNetworkReply* reply =QNetworkAccessManager::post(requst,post_data);

下面给出同步的post访问的代码,方便我以后copy用(入参num是我自己根据需求设置的,不需要关注)

void NetCpp::syncPostOfFormData(QString url, QMap<QString,QString> mapData, int num)
{
    QByteArray post_data;
    QString strAnd="&";
    QMap<QString,QString>::iterator it;
    for(it=mapData.begin(); it!=mapData.end();it++)
    {
        QString key=it.key();
        QString val=it.value();

        QString str=key+"="+val+strAnd;
        post_data.append(str);
    }

    QNetworkRequest requst;
    //QString header="application/json";
    QString header="application/x-www-form-urlencoded";
    requst.setHeader(QNetworkRequest::ContentTypeHeader,header);
    requst.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());

    requst.setUrl(QUrl(url));

    requst.setAttribute(QNetworkRequest::User,num);

    QNetworkReply* reply =QNetworkAccessManager::post(requst,post_data);
    QEventLoop loop;
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
}

 

结束语

知识点又增加了一个。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Qt和libcurl发送POST表单图片的示例代码: ```c++ #include <QtNetwork> #include <curl/curl.h> void sendPostFormImage() { // 1. 读取图片数据 QFile file("image.jpg"); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open file"; return; } QByteArray imageData = file.readAll(); file.close(); // 2. 设置POST表单数据 QString boundary = "---------------------------" + QString::number(QDateTime::currentMSecsSinceEpoch()); QByteArray postData; postData.append("--" + boundary + "\r\n"); postData.append("Content-Disposition: form-data; name=\"image\"; filename=\"image.jpg\"\r\n"); postData.append("Content-Type: image/jpeg\r\n\r\n"); postData.append(imageData + "\r\n"); postData.append("--" + boundary + "--\r\n"); // 3. 设置libcurl参数 CURL* curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/upload"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.data()); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postData.size()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, QStringList() << "Content-Type: multipart/form-data; boundary=" + boundary.toLatin1().data()); curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 4. 执行请求 CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { qDebug() << "Failed to send POST form: " << curl_easy_strerror(res); } curl_easy_cleanup(curl); } } ``` 该示例使用Qt的QFile类读取图片数据,然后使用libcurl发送POST表单数据,其中包括一个包含图片数据的文件字段。boundary变量用于分隔不同的表单字段。最后,将Content-Type标头设置为"multipart/form-data"和boundary值,以便服务器正确解析数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值