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 la methode GET


Sujet :

Qt

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut QHttp et la methode GET
    Bonjour,
    je me suis lancé dans Qt et voudrais recupere le code source d'une page web et l'afficher dans un "label" de ma fenetre j'arrive a la mettre dans un fichier mais j'ai un probleme pour afficher le code sans qu'il soit dans un fichier

    Mon probleme est la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    http->get(adresse.toString(), source);
    resultat->setText(source);
     
    //rien ne s'affiche :(
    Donc voila si quelqu'un peut m'aider....

    Merci d'avance

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    Ton problème vient probablement du fait que la fonction QHttp::get(...) fonctionne de manière asynchrone.

    Citation Envoyé par QtDoc
    The function does not block; instead, it returns immediately. The request is scheduled, and its execution is performed asynchronously.
    En d'autres termes, quand dans ton code la ligne 'get(...)' a fini d'être exécutée, ce n'est pas pour autant que la réponse a été reçue. C'est simplement que la requête a bien été envoyée vers la cible et donc que tu recevras la réponse (le code source de la page) un peu plus tard (probablement dans quelques dizaines de ms, mais ça peut très bien être dans 10 secondes ou bien encore dans 3 minutes).

    Pour savoir quand la réponse sera effectivement disponible, il faut stocker l'entier (un identifiant unique) retourné par la fonction QHttp::get(...) et connecter un slot au signal QHttp:requestFinished(int id, bool error).

    Lorsque ce slot est appelé avec pour id la valeur stockée auparavant, tu peux seulement faire ton resultat->setText(source);
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Je comprends pas bien peut tu préciser ce qu'est ta variable source (le type) ?
    Je pense que tu devrais passer par un QBuffer et après réussir a le transformer en QString pour pouvoir afficher le texte. Il y peut être une meilleur solution mais comme ca j'ai pas plus d'idée. Sinon pour un exemple avec d'utilisation de QHttp et de get() tu as la FAQ.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    ok merci je vais essayer de faire comme ce que m'a dit nouknouk
    mais comme je suis depuis peu sous qt
    tu peut me montrer en gros comment on fait


    merci beaucoup

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Entre le tutoriel sur les signaux/slots et la Doc Qt de QHttp, tu t'en sortiras tout seul comme un grand j'en suis persuadé

    Un petit indice au passage: QHttp écrit uniquement dans un QIODevice et setText n'accepte quant à lui qu'un QString. Or:
    - QBuffer est un QIODevice
    - que sa fonction QBuffer::buffer() te retourne un QByteArray
    - qu'un des constructeurs de QString accepte en paramètre un QByteArray
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Voila mon code source complet :
    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
    53
    54
    55
    56
    57
    58
     
    #include <QtGui>
    #include <QtCore>
    #include <QtDebug>
    #include <QtNetwork>
    #include "mainwindow.h"
     
    //
    MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f) 
    	: QMainWindow(parent, f)
    {   
     
        http = new QHttp(this);
    	setupUi(this);
     
         connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(httpRequestFinished(int, bool)));
         //connect(http, SIGNAL(dataReadProgress(int, int)),this, SLOT(updateDataReadProgress(int, int)));
         connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),this, SLOT(readResponseHeader(const QHttpResponseHeader &)));											
    	 connect(btsend, SIGNAL(clicked()),this, SLOT(downloadFile()));
     
    }
     
    	void MainWindowImpl::downloadFile()
     	{
     
         QUrl url(host->text());  
         http->setHost(url.host(), url.port() != -1 ? url.port() : 80);   
         http->setUser(url.userName(), url.password());
         source = http->get(url.path());
         httpRequestAborted = false;     
         //httpGetId = http->get(url.path(), file);
     
     
        }
     
     
         void MainWindowImpl::httpRequestFinished(int requestId, bool error)
         {
     
             if (error) {
                    resultat->setText("error");		
             } else {
     
    		resultat->setText(source);
     
             }
     
          }
     
         void MainWindowImpl::readResponseHeader(const QHttpResponseHeader &responseHeader)
         {
             if (responseHeader.statusCode() != 200) {
                 resultat->setText("error");
                 httpRequestAborted = true;
                 http->abort();
                 return;
             }
         }
    j'ai essayer de faire ce que tu m'a dit --> httpRequestFinished mais ca ne marche tjr pas

  7. #7
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    tu utilises la mauvaise version de QHttp:get(), celle avec un seul argument (ie. le second argument est celui par défaut, soit QIODevice* = '0'). Cette 'version' n'est pas celle que je t'ai décrite. Si tu veux l'utiliser, elle est à employer de pair avec les fonction 'read' ou 'readAll'.

    Citation Envoyé par DocQt
    If the IO device to is 0 the readyRead() signal is emitted every time new content data is available to read.

    If the IO device to is not 0, the content data of the response is written directly to the device. Make sure that the to pointer is valid for the duration of the operation (it is safe to delete it when the requestFinished() signal is emitted).
    Dans le deuxième cas (celui que j'ai évoqué ci-dessus), spécifie un QIODevice qui va bien (cf. mes indices) pour que le résultat de ta requête soit stocké dans ce QIODevice, résultat que tu récupèreras ensuite pour le convertir en QString et enfin le passer à setText().
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Oui j'ai fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QBuffer* buffer = new QBuffer;
    http->get(url.path(), buffer);
    mais je n'arrive pas a convertir le buffer en Qstring !!

  9. #9
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Est ce que ton QBuffer est bien rempli. Si oui la procédure pour avoir une QString a partir d'un QBuffer est expliqué par nouknouk.

    Citation Envoyé par nouknouk
    Un petit indice au passage: QHttp écrit uniquement dans un QIODevice et setText n'accepte quant à lui qu'un QString. Or:
    - QBuffer est un QIODevice
    - que sa fonction QBuffer::buffer() te retourne un QByteArray
    - qu'un des constructeurs de QString accepte en paramètre un QByteArray
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Oui mais comme je debute dans Qt pouvez vous etre plus precis

    Merci

  11. #11
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par and1dx Voir le message
    Oui mais comme je debute dans Qt pouvez vous etre plus precis
    Au risque de me répéter, le principe de base: QIODevice => QBuffer => QByteArray => QString.

    Ainsi, convertir ton QIODevice en QString est quelque chose de trivial à partir du moment ou tu prends le temps de te plonger un minimum dans la doc de Qt (je t'ai même donné les noms des classes et des fonctions à regarder !) et que tu as des connaissances basiques en C++.

    Si tu n'y arrives toujours pas (ou plutôt si tu ne veux pas prendre le temps d'y réfléchir par toi-même), on ne pourra plus grand chose pour toi.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Tu peux me dire ou est l'erreur car j'ai mis buff est QbyteArray !!

    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
     
    void MainWindowImpl::downloadFile()
     	{
     
         QBuffer *buff = new QBuffer;
     
         QUrl url(host->text());  
         http->setHost(url.host(), url.port() != -1 ? url.port() : 80);   
         http->setUser(url.userName(), url.password()); 
         http->get(url.path(),buff);
         httpRequestAborted = false;
     
     
     
     
         // QByteArray byts;//
         byts = buff->buffer();
     
         resultat->setText(byts);     
     
     
        }
     
     
         void MainWindowImpl::httpRequestFinished(int requestId, bool error)
         {
     
             if (error) {
                    resultat->setText("error");		
             } else {
             	//resultat->setText("requete fini");
             	//code->toPlainText("hihihi");
     
             }
     
          }
    Merci

  13. #13
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    C'est asynchrone donc ton buffer ne sera rempli qu'une fois la fonction httpRequestFinished(int requestId, bool error) executé. Utilise un debugger tu comprendra mieux je pense.

    [EDIT] Désolé nounouk j'ai posté en même temps que toi.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  14. #14
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         http->get(url.path(),buff);
         httpRequestAborted = false;
         // QByteArray byts;//
         byts = buff->buffer();
         resultat->setText(byts);
    On en revient à ma première remarque:
    Ton problème vient probablement du fait que la fonction QHttp::get(...) fonctionne de manière asynchrone.
    Il te faut donc remettre en place le système avec le signal requestFinished() et le slot qui y est connecté. Comme dans ton post de 12h39, quoi.

    EDIT: grilled
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Alors je vous es ecouté a la lettre !!!! et j'ai place dans httpRequestFinished

    Mais toujours rien donc si vous pouviez me donner une portions de code car j'y suis depuis ce matin

    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
     
    void MainWindowImpl::downloadFile()
     	{
     
         QBuffer *buff = new QBuffer;
     
         QUrl url(host->text());  
         http->setHost(url.host(), url.port() != -1 ? url.port() : 80);   
         http->setUser(url.userName(), url.password()); 
         http->get(url.path(),buff);
         httpRequestAborted = false;
     
     
     
     
         // QByteArray byts;//
         byts = buff->buffer();
     
     
     
     
        }
     
     
         void MainWindowImpl::httpRequestFinished(int requestId, bool error)
         {
     
             if (error) {
                    resultat->setText("error");		
             } else {
             	//resultat->setText("requete fini");
             	//code->toPlainText("hihihi");
                 resultat->setText(byts);
             }
     
          }

  16. #16
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Il te manquerait pas un petit connect de ton slot sur le signal httpRequestFinished dans le lot ?
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    non je ne l'est pas mis dans le code mais ils dont la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(httpRequestFinished(int, bool)));
         //connect(http, SIGNAL(dataReadProgress(int, int)),this, SLOT(updateDataReadProgress(int, int)));
         connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),this, SLOT(readResponseHeader(const QHttpResponseHeader &)));											
    	 connect(btsend, SIGNAL(clicked()),this, SLOT(downloadFile()));
    alors tu sais pourquoi ca marche pas ?

  18. #18
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Tout d'abord, il serait plus sage de déplacer byts = buff->buffer(); dans le slot httpRequestFinished, puisque tu veux utiliser le contenu du buffer une fois la requête terminée.

    Sinon, si ça marche toujours pas, as-tu bien vérifié que le slot est bien appelé à la fin de la requête, et donc que ton connect est valide ?
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bon j'arrete j'en ai trop mare !!!!!

    Je voulais une fontion qui recupere le code source d'une page web donc si tu as la solution merci de me la donner


    Merci

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    C'est bon j'ai resolu le pb et pas besoins de Qbuffer ou quoi que ce soit juste un http->readAll();

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/09/2005, 12h17
  2. prob tres simple, form, method get
    Par killy-kun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 25/08/2005, 10h29
  3. Faire Choix du fichier destination methode GET grace a JS
    Par ahage4x4 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/06/2005, 15h26
  4. la méthode get du Net::telnet
    Par BENCHEKROUN dans le forum Modules
    Réponses: 4
    Dernier message: 25/05/2005, 12h31
  5. probleme avec methode get
    Par Tr@nkill dans le forum ASP
    Réponses: 2
    Dernier message: 12/05/2005, 13h54

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