如何发出http post请求以上载post查询和;以C++;Qt 我有样本代码,在C语言,Windows Phone 7,Silverlight中,我正在尝试如何在C++ QT中做等价的操作(我在黑莓10 beta 3 SDK中工作)。我可以使用QNetworkAccessManager?还是有更好的办法?如果可以的话,我将非常感谢您对如何做到这一点的帮助和一些示例代码。以下是示例C#代码:
以下是我尝试过的一些东西:如何发出http post请求以上载post查询和;以C++;Qt 我有样本代码,在C语言,Windows Phone 7,Silverlight中,我正在尝试如何在C++ QT中做等价的操作(我在黑莓10 beta 3 SDK中工作)。我可以使用QNetworkAccessManager?还是有更好的办法?如果可以的话,我将非常感谢您对如何做到这一点的帮助和一些示例代码。以下是示例C#代码:,c#,c++,qt,restsharp,blackberry-cascades,C#,C++,Qt,Restsharp,Blackberry Cascades,以下是我尝试过的一些东西: // postVars is a QByteArray that contains a query string of the arguments // being passed in then I pass it in to my prepareFileUploadRequest file, // which appends the data for uploading a file. void Utils::prepareFileUploadReques
// postVars is a QByteArray that contains a query string of the arguments
// being passed in then I pass it in to my prepareFileUploadRequest file,
// which appends the data for uploading a file.
void Utils::prepareFileUploadRequest(QMap<QString, QString> *d,
QNetworkRequest &request, QByteArray &postVars, QString path,
QString scriptName, QString filename,
QString stockNum)
{
request.setUrl(QUrl(Utils::ApiUrl));
postVars.append("Content-type: multipart/form-data, ");
postVars.append("boundary='---';\r\n\r\n");
postVars.append("---\r\n");
postVars.append("Content-Disposition: form-data; name='file' );
postVars.append("filename='examplePic.jpg'\r\n");
postVars.append("Content-Type: image/jpg\r\n");
postVars.append("Content-Transfer-Encoding: binary\r\n\r\n");
QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
return;
}
postVars.append(file.readAll() + "\r\n");
postVars.append('---');
request.
setRawHeader(QString("Content-Type").toAscii(),
QString("multipart/form-data; boundary='---'").toAscii());
request.
setRawHeader(QString("Content-Length").toAscii(),
QString::number(postVars.length()).toAscii());
QNetworkAccessManager *nam = new QNetworkAccessManager(this);
connect(nam, SIGNAL(finished(QNetworkReply *)),
this, SLOT(handleUpload(QNetworkReply *)));
nam->post(request, postVars);
}
//postVars是一个QByteArray,它包含一个参数查询字符串
//传入后,我会将其传入我的PrepareFileUpload请求文件,
//它附加用于上载文件的数据。
无效Utils::prepareFileUploadRequest(QMap*d,
QNetworkRequest和request、QByteArray和postVars、QString路径、,
QString脚本名,QString文件名,
QString stockNum)
{
setUrl(QUrl(Utils::apirl));
append(“内容类型:多部分/表单数据,”);
append(“boundary='--';\r\n\r\n”);
postVars.append(“--\r\n”);
append(“内容处置:表单数据;name='file');
append(“filename='examplePic.jpg'\r\n”);
append(“内容类型:image/jpg\r\n”);
append(“内容传输编码:二进制\r\n\r\n”);
QFile文件(路径);
如果(!file.open(QIODevice::ReadOnly)){
返回;
}
postVars.append(file.readAll()+“\r\n”);
postVars.append('--');
要求
setRawHeader(QString(“内容类型”).toAscii(),
QString(“多部分/表单数据;边界='--'”).toAscii();
要求
setRawHeader(QString(“内容长度”).toAscii(),
QString::number(postVars.length()).toAscii();
QNetworkAccessManager*nam=新的QNetworkAccessManager(此);
连接(nam,信号(完成(QNetworkReply*)),
这个插槽(handleUpload(QNetworkReply*));
nam->post(请求,postVars);
}
我调用了上面的函数,然后得到了一个xml回复——它说我没有权限——并且它没有上传任何文件——所以这可能是所使用的php Web服务的一个问题,但是这让我很难判断我是否采取了正确的方法,或者我是否做了任何错误的事情。
}QString body=“”;
常量QUrl url(“http://someurl.to/make/the/post" );
QHttpMultiPart*multiPart=新的QHttpMultiPart(QHttpMultiPart::FormDataType);
qhttpparttextpartdata;
body=“”;
QTextStream(&body)打开(QIODevice::ReadOnly);
imagePart.setBodyDevice(文件);
file->setParent(multiPart);//我们现在无法删除该文件,因此请使用multiPart删除它
多部分->附加(imagePart);
}
多部分->附加(textPartData);
多部分->附加(textPartProductDetails);
多部分->附加(textPartDataDelivery);
QNetworkRequest请求(url);
QNetworkReply*reply=m_networkAccessManager->post(请求,多部分);
连接(应答,信号(finished()),此,插槽(onNetworkResponse());
到目前为止您尝试了什么?只需查看QNetworkAccessManager的手册页,它有一个post方法。然后在谷歌上搜索“使用qt上传文件”“。都在那里。我添加了一些我现在已经尝试过的东西,使用你告诉我的谷歌代码。很好!那么您是在另一台机器上针对Web服务测试您的程序?对于测试,这将是一个很好的开始,可以设置您的on-web服务(使用Apache),并针对它进行测试。设置Apache很容易!
// postVars is a QByteArray that contains a query string of the arguments
// being passed in then I pass it in to my prepareFileUploadRequest file,
// which appends the data for uploading a file.
void Utils::prepareFileUploadRequest(QMap<QString, QString> *d,
QNetworkRequest &request, QByteArray &postVars, QString path,
QString scriptName, QString filename,
QString stockNum)
{
request.setUrl(QUrl(Utils::ApiUrl));
postVars.append("Content-type: multipart/form-data, ");
postVars.append("boundary='---';\r\n\r\n");
postVars.append("---\r\n");
postVars.append("Content-Disposition: form-data; name='file' );
postVars.append("filename='examplePic.jpg'\r\n");
postVars.append("Content-Type: image/jpg\r\n");
postVars.append("Content-Transfer-Encoding: binary\r\n\r\n");
QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
return;
}
postVars.append(file.readAll() + "\r\n");
postVars.append('---');
request.
setRawHeader(QString("Content-Type").toAscii(),
QString("multipart/form-data; boundary='---'").toAscii());
request.
setRawHeader(QString("Content-Length").toAscii(),
QString::number(postVars.length()).toAscii());
QNetworkAccessManager *nam = new QNetworkAccessManager(this);
connect(nam, SIGNAL(finished(QNetworkReply *)),
this, SLOT(handleUpload(QNetworkReply *)));
nam->post(request, postVars);
}
QString body = "" ;
const QUrl url("http://someurl.to/make/the/post" );
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart textPartData;
body = "" ;
QTextStream(&body) << " this is your text to post with the file";
textPartData.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=utf-8");
textPartData.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"data\""));
textPartData.setBody(body.toAscii());
for(int i=0; i< number_of_files_to_send ; i++){
QHttpPart imagePart;
QString header_body = "";
QTextStream(&header_body) << "form-data; name=\"" << name_of_the_file << "\"; filename=\"" << name_of_the_file << ".jpg\"" ;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(header_body));
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
//prepare file for upload
QString filepath;
QTextStream(&filepath) << FunkyPigeonBlackberry::getInstance()->dataModelProductDetails()->custom_image(i).value("cut_image").toString();
// pack the new file
QFile *file = new QFile(filepath);
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
multiPart->append(imagePart);
}
multiPart->append(textPartData);
multiPart->append(textPartProductDetails);
multiPart->append(textPartDataDelivery);
QNetworkRequest request(url);
QNetworkReply* reply = m_networkAccessManager->post(request, multiPart);
connect(reply, SIGNAL(finished()), this, SLOT(onNetworkResponse()));