前言
我之前只用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();
}
结束语
知识点又增加了一个。