• 8846阅读
  • 4回复

有人用过QNetworkAccessManager::put()的么?小弟请教个问题 [复制链接]

上一主题 下一主题
离线l_xin
 
只看楼主 正序阅读 楼主  发表于: 2010-07-22
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
webservice要求提交一个带有complex type的request来更新数据库。结构如下:
            <xs:complexType name="CreateUpdateMovieRequest">
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="ageListForMovie" nillable="true" type="ax25:AgeEntity"/>
                    <xs:element minOccurs="0" name="country" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="director" nillable="true" type="xs:string"/>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="genderListForMovie" nillable="true" type="ax25:GenderEntity"/>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="genreListForMovie" nillable="true" type="ax25:GenreEntity"/>
                    <xs:element minOccurs="0" name="imageName" nillable="true" type="xs:string"/>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="interestListForMovie" nillable="true" type="ax25:InterestEntity"/>
                    <xs:element minOccurs="0" name="language" nillable="true" type="xs:string"/>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="languageListForMovie" nillable="true" type="ax25:LanguageEntity"/>
                    <xs:element minOccurs="0" name="movieDuration" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="movieFileName" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="movieId" type="xs:int"/>
                    <xs:element minOccurs="0" name="movieName" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="plot" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="releasedDt" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="synopsis" nillable="true" type="xs:string"/>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="tagListForMovie" nillable="true" type="ax25:TagEntity"/>
                </xs:sequence>
            </xs:complexType>

看文档上说put内只能放 QByteArray 和 QIODevice,我该怎么做才能上传我要的这个Complex Type
小弟在这里谢过了
离线l_xin
只看该作者 4楼 发表于: 2010-07-26
嗯,折腾了一整天,终于搞定了。

简单说下我自己的解决方案的思路:

既然WebService要求request带一个complex type的XML,那我就按照WSDL里说明的Type造一个XML。
用的是QXmlStreamWritter xmlWritter(QByteArray *data); 构造完XML,调用post(request, data); 测试后终于成功了。

这样看来无论webservice要求多复杂结构的XML作为data加入request,都可以用QXmlSreamWritter + QByteArray 来实现。

附带一个参考链接:http://community.freshbooks.com/forums/viewtopic.php?id=4384  这里用的是标准c++库来写XML,比较机械,对于稍微复杂或者带有较多节点的复杂XML写起来工作量就比较大了,所以我考虑用QXmlStreamWritter会更灵活方便

ps:貌似这里人气还是不够旺啊……
离线l_xin
只看该作者 3楼 发表于: 2010-07-24
感谢回复,不过formdata部分没看懂加入的是什么,看起来是毫无关系的一些东西,可以解释一下吗?
离线tootzoe
只看该作者 2楼 发表于: 2010-07-23
非常简单.....

  1. #include <QtGui>
  2. #include <QtNetwork/QNetworkAccessManager>
  3. #include <QUrl>
  4. #include <QtNetwork/QNetworkRequest>
  5. #include <QtNetwork/QNetworkReply>
  6. static QNetworkReply *reply;
  7. class TOOTLabel : public QLabel
  8. {
  9.     Q_OBJECT
  10. public:
  11.     TOOTLabel(QWidget *parent =0)  : QLabel(parent) {
  12.     uploadBtn = new QPushButton("uplaod....");
  13.     connect(uploadBtn, SIGNAL(clicked()), this, SLOT(uploadFile()));
  14.     uploadBtn->show();
  15.     uploadBtn->resize(240,100);
  16.     }
  17.     ~TOOTLabel()
  18.     {
  19.          delete reply2;
  20.     }
  21. public slots:
  22.     void TOOTReadyRead()
  23.     {
  24.         QImage img  ;
  25.         img.load(reply, "JPEG");
  26.         setPixmap(QPixmap::fromImage(img));
  27.         show();
  28.         resize(img.width(),img.height());
  29.     }
  30.     void uploadFile()
  31.     {
  32.         QStringList fileList = QFileDialog::getOpenFileNames(
  33.                 this,tr("Select some files to upload....")
  34.                 ,QDir::currentPath());
  35.         if(fileList.count() < 1) return;
  36.         manager2 = new QNetworkAccessManager;
  37.        // QString fileName = "tootzoe.jpg";
  38.         QString newPathName = "newtootzoe.jpg";
  39.         // foreach(QString fileName, fileList){
  40.         QString fileName = fileList.at(0);
  41.         file = new QFile(fileName);
  42.         if(!file->open(QFile::ReadOnly  )) { qDebug() << "Error opening file....";return ;}
  43.         ////===================================================
  44.         QByteArray formData;
  45.         QString _boundary = "-----------------------------7d6bb34502ce";
  46.         QString contenttype = "multipart/form-data; boundary=" + _boundary;
  47.         formData.append(QString("--" + _boundary + "\r\n").toAscii());
  48.         //
  49.         formData.append(QString("Content-Disposition: form-data; name=\"Filename\"\r\n\r\n").toUtf8());
  50.         formData.append(QString(fileName +"\r\n").toUtf8());
  51.         formData.append(QString("--" + _boundary + "\r\n").toAscii());       // ASCII encoder
  52.         //////////
  53.         formData.append(QString("Content-Disposition: form-data; name=\"RelPathName\"\r\n\r\n").toUtf8());
  54.         formData.append(QString(newPathName +"\r\n").toUtf8());
  55.         formData.append(QString("--" + _boundary + "\r\n").toAscii());        // ASCII encoder
  56.         //////////
  57.         formData.append(QString("Content-Disposition: form-data; name=\"sqlQuery\"\r\n\r\n").toUtf8());
  58.         formData.append(QString("FlashSentFileData\r\n").toUtf8());
  59.         formData.append(QString("--" + _boundary + "\r\n").toAscii());      // ASCII encoder
  60.         //数据块 begin
  61.         formData.append(QString("Content-Disposition: form-data; name=\"Filedata\"; filename=\"" + fileName + "\"\r\n").toUtf8());
  62.         formData.append(QString("Content-Type: application/octet-stream\r\n\r\n").toUtf8());
  63.         formData.append( file->readAll());
  64.         formData.append(QString("\r\n").toAscii());
  65.         //数据块 end
  66.         formData.append(QString("--" + _boundary + "--\r\n").toAscii());
  67.         QNetworkRequest request2(QUrl("http://localhost/console/uploadfile.aspx")) ;
  68.         request2.setHeader(QNetworkRequest::ContentTypeHeader, contenttype);
  69.         request2.setHeader(QNetworkRequest::ContentLengthHeader, formData.size());
  70.         reply2 = manager2->post(request2,    formData);
  71.         connect(reply2, SIGNAL(finished()), this,SLOT(uploadFileFinished()));
  72.         qDebug() << "uploading " << fileName;
  73.       //  }
  74.         file->close();
  75.     }
  76.     void uploadFileFinished()
  77.     {
  78.                 qDebug() << "finished upload.... " << reply2->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()  ;
  79.         qDebug() << QString(  reply2->readAll() );
  80.     }
  81. private:
  82.     QPushButton *uploadBtn;
  83.     QNetworkAccessManager *manager2;
  84.     QNetworkReply *reply2;
  85.     QFile  *file;
  86. };
  87. int main(int argc, char **argv)
  88. {
  89.     QApplication app(argc, argv);
  90.     QNetworkAccessManager manager;
  91.     QNetworkRequest request;
  92.     request.setUrl(QUrl("http://www.google.com/intl/en_ALL/images/logo2.gif"));
  93.     reply = manager.get(request);    
  94.     TOOTLabel imgLabel;
  95.     QObject::connect( reply, SIGNAL(finished()), &imgLabel, SLOT(TOOTReadyRead()));
  96.     imgLabel.show();
  97.     return app.exec();
  98. }
  99. #include "main.moc"
离线l_xin
只看该作者 1楼 发表于: 2010-07-23
没人用过么?? 有人可以指点一下么=,=

是否用

QNetworkRequest request; request.setUrl(QUrl("http://xxxxxxxxxx/xxxxxxx/xxxxxxxxx")); //设置URL

QByteArray data = "country=1&direction=3&language=7&............." // 设置data???

QNetworkReply *rtn = networkManager->put.(request,data);  // 发送put 请求

如果是,那像type是GenderEntity 的这种应该怎么放data去。
快速回复
限100 字节
 
上一个 下一个