IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Qhttp et Xml


Sujet :

Qt

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut Qhttp et Xml
    Bonjour à tous et à toutes,

    Problèmes :
    Voila je tentes de récupérer le fichier XML retourné par la page Web mais pour cela il faut que j'utilise l'User-Agent de mozilla.

    J'ai essayé plusieurs choses mais rien n'y fait, a mon grand désespoir.

    Codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    buffer = new QBuffer;
    QUrl adresse("http://eu.wowarmory.com/character-sheet.xml");
     
    QHttpRequestHeader header("POST","http://eu.wowarmory.com/character-sheet.xml?r=Dalaran&n=Unicorniste");
    header.setValue("Host","eu.wowarmory.com");
    header.setValue("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14");
     
    connexion = new QHttp(adresse.host(),80);
     
    connect(connexion,SIGNAL(done( bool )),this,SLOT(affichage ( bool )));
    connect(connexion, SIGNAL(dataReadProgress(int, int)),this,SLOT(progression(int,int)));
     
    connexion->request(header,buffer);
     
    dataPG->setVisible(true);
    et pour l'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(error) {
        QMessageBox::critical(this,"Erreur","Erreur");
        return;
    } else {
        QString data = buffer->readAll();
        xmlReturn->setPlainText( data );
        dataPG->setVisible(false);
        connexion->close();
    }
    Merci d'avance

  2. #2
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    salut,

    deja essais en enlevant le http pour l'url.

    je suis en train de coder un petit programme pour te montrer mais il faut encore un peux de patience car je n'ai pas beaucoup de temp en ce moment et j'ai un peux galere car je ne connaissais pas QHttp mais je suis sur la bonne voie j'arrive a recuperer le code d'une page web. encore une tite erreur a corriger et je poste mon code


    tu dis au dessus que tu utilise l'User-Agent de mozilla, mais cela est un choix ou une obligation ?
    pensez au

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Si je laisses l'user agent par défaut il me retourne le source de la page interprété par le xslt, alors qu'avec l'user agent de mozilla firefox ça me retourne la page xml brute, ce qui me permet de lire les informations dedans.

    Pour le coup du http devant j'ai essayé avec GET / POST les content (bytearray), ecrire buffer ou fichier, affichage dans une QEditBox, par le biais de request / get, et rien

    Je te remercie de ton aide, j'ai toujours pas trouvé et pourtant ça fait 2 jours que j'y gratte à croire que Qt ne veux pas de moi

    Si tu y arrives je te fait roi

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ne serait-ce pas parce que QHttp est asyncrone?
    donc ne faudrait-il pas bloquer jusqu'a obtenir la reponse?

  5. #5
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    Bon voila c'est tout résolu comme tu le voulais =)


    voici mon code, tu m'excuseras d'une part le nom des fichier qui ne sont pas tés recherché et d'autre part les inclusions, car par grande flemme j'ai directement inclu QtGui et QtNetwork ...

    main.cc qui ne fait qu'instancier mon objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <QApplication>
     
    #include "classe.h"
     
    int main(int argc, char** argv) {
        QApplication app(argc, argv);
     
        classe maclasse;
     
        return app.exec();
    }

    classe.h


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #ifndef __CLASSE_H__
    #define __CLASSE_H__
     
     
    #include <QtGui>
    #include <QtNetwork>
     
     
    class classe: public QTextEdit{
    Q_OBJECT
    private:
        QHttp req;
     
    public:
        classe();
     
    public slots:
        void affiche(bool);
        void fin(int, bool);
    };
     
     
     
     
    #endif


    et classe.cc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include "classe.h"
     
     
     
    classe::classe() {
        QObject::connect(&req, SIGNAL(done(bool)), this, SLOT(affiche(bool)));
        QObject::connect(&req, SIGNAL(requestFinished(int, bool)), this, SLOT(fin(int, bool)));
     
        req.setHost("eu.wowarmory.com");
     
        QHttpRequestHeader header("POST","http://eu.wowarmory.com/character-sheet.xml?r=Dalaran&n=Unicorniste");
        header.setValue("Host","eu.wowarmory.com");
        header.setValue("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14");
     
        req.request(header);
     
        show();
    }
     
    void classe::fin(int _id, bool _error) {
        if(_error)
            QMessageBox::information(0, "Fin", QString().setNum(req.error()));
    }
     
    void classe::affiche(bool) {
        setText(QString(req.readAll().data()));
    }


    voila !

    sur ce bonne soirée/nuit.

    Dup.
    pensez au

  6. #6
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Bon super merci c'est résolu, c'est bizzard j'utilisais l'instanciation dynamique et ça marchais pas alors qu'avec le statique ça fonctionne du premier coup

    Merci encore a toi, te voila

  7. #7
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    Bon aller pour faire sa bien voila le code d'un programme un peux plus "fini", sa ressemble un peux a un navigateur web sauf que celui ci n'interprète que le html donc pas de css ni de js... mais bon le but est juste de montrer comment récupérer le source d'une page web et non comment l'interpreter !

    Pour rester dans le cadre de la question de acesyde, le code xml s'affiche tel quel.

    Dans le champ tout en haut on peux entrer nimporte quelle url ( avec ou sans le http ), ensuite une pression sur le boutton valider lance la requette, une progressBar indique dans un premier temp l'avancement de la requette et ensuite l'avancement de la lecture des données.


    Voici le code :

    le main.cc qui ne sert toujours que pour instancier ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QApplication>
     
    #include "classe.h"
     
     
    int main(int argc, char** argv) {
        QApplication app(argc, argv);
     
        classe maclasse;
     
        return app.exec();
    }
    classe.h ( non je n'ai toujours pas changé ni les nom de fichiers ni les includes ... )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #ifndef __CLASSE_H__
    #define __CLASSE_H__
     
     
    #include <QtGui>
    #include <QtNetwork>
     
    #include "fenetre.h"
     
     
    class classe: public QMainWindow, public Ui::m_fenetre {
    Q_OBJECT
    private:
        QHttp     req;
     
    public:
        classe();
     
    public slots:
        void affiche(bool);
        void majPB(int, int);
        void fin(int, bool);
        void execReq();
    };
     
     
     
     
    #endif

    le classe.cc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include "classe.h"
     
     
     
    classe::classe() {
        setupUi(this);    
     
        QObject::connect(&req, SIGNAL(done(bool)), this, SLOT(affiche(bool)));
        QObject::connect(&req, SIGNAL(dataSendProgress(int, int)), this, SLOT(majPB(int, int)));
        QObject::connect(&req, SIGNAL(requestFinished(int, bool)), this, SLOT(fin(int, bool)));
        QObject::connect(m_button, SIGNAL(pressed()), this, SLOT(execReq()));
        QObject::connect(&req, SIGNAL(dataReadProgress(int, int)), this, SLOT(majPB(int, int)));
     
        show();
    }
     
    void classe::majPB(int _done, int _total){
        m_progressBar->setMaximum(_total);
        m_progressBar->setValue(_done);
    }
     
    void classe::fin(int _id, bool _error) {
        if(_error)
            QMessageBox::information(0, "Fin", QString().setNum(req.error()));
    }
     
    void classe::affiche(bool) {
        m_textEdit->setText(QString(req.readAll().data()));
    }
     
    void classe::execReq() {
        QStringList tmp = m_adresse->text().split("/");
        QString host;
        QString page = "/";
     
        if(tmp[0] != "http:"){
            host = tmp[0];
            for(int i=1;i<tmp.count();i++)
                page+="/"+tmp[i];
        } else {
            host = tmp[2];
            for(int i=3;i<tmp.count();i++)
                page+="/"+tmp[i];
        }
     
        req.setHost(host);
     
        QHttpRequestHeader header("POST",page);
        header.setValue("Host",host);
        header.setValue("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14");
        req.request(header);
    }

    Dup.
    pensez au

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. xml -> xsl -> xml
    Par virgile04 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/10/2002, 16h53
  2. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29
  3. delphi XML / HTML caractéres speciaux !
    Par adem dans le forum EDI
    Réponses: 2
    Dernier message: 29/08/2002, 17h48
  4. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  5. Pas de casse dans les XML
    Par :GREG: dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo