前言

我之前只用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();
}

 

结束语

知识点又增加了一个。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐