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

Discussion :

QHttp et Validation w3c

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut QHttp et Validation w3c
    Bonsoir,

    Je participe au dévellopement d'un Editeur Web et j'aimerais réaliser la validation d'un document par le w3c via la classe QHttp. Je me suis renseigné sur l' API de la W3C ici et j'ai ainsi realisé ce bout de code :

    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
    void Editeur::validation()
    {
        QHttpRequestHeader header("POST", "/check", 1, 1);
        header.setValue("Host", "validator.w3.org");
        header.setValue("Content-type", "multipart/form-data, boundary=AaB03x");
        header.setValue("Cache-Control", "no-cache");
        header.setValue("Accept","*/*");
     
        QByteArray text = this->toPlainText().toLatin1 ();
        if(bytes)
            delete bytes;
        bytes = new QByteArray();
        bytes->append("--AaB03x\r\n");
        bytes->append("Content-Disposition: ");
        bytes->append("form-data; name=\"uploaded_file\"; filename=\"test\"\r\n");
        bytes->append("\r\n");
        bytes->append(text);
        bytes->append("\r\n");
        bytes->append("--AaB03x--");
        int contentLength = bytes->length();
        header.setContentLength(contentLength);
     
        QFile file("out.txt");
        file.open(QIODevice::WriteOnly);
        http->setHost("validator.w3.org", 80);
        http->request(header, *bytes, &file);
    }
    Editeur est un QTextEdit, et j'aimerais donc récupérer le texte de ce QTextEdit et l'envoyer à la W3C tester sa validité.
    J'ai des problèmes un peu partout mais malheureusement je n'arrive pas à les identifier
    Je me suis aidé de deux signaux émis par le QHttp pour essayer d'identifier les problèmes :
    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
     
    connect(http, SIGNAL(stateChanged(int)), this, SLOT(etat(int)));
    connect(http, SIGNAL(responseHeaderReceived(QHttpResponseHeader)), this, SLOT(reponse(QHttpResponseHeader)));
     
    ...
     
     
    void Editeur::etat(int i)
    {
        cout<<i;
        cout<<http->errorString().toStdString()<<endl;
    }
     
    void Editeur::reponse(QHttpResponseHeader t)
    {
        cout<<<<endl;
    }
    Mes problèmes : tout d'abord "http->errorString().toStdString()" m'affiche tout le temps Unknown Error, je n'ai pas réussi une seule fois à recevoir un message me signalant aucune erreur.
    Ensuite, j'ai des problèmes d' écritures dans le fichier : Quand le programme ne plante pas à la ligne http->request(header, *bytes, &file); , j'ai un message d'erreur me signifiant qu'il y a un problème avec le write du QIODevice ...

    La seule bonne nouvelle malgré tout est que t.reasonPhrase().toStdString() me renvoit tout le temps OK ^^

    Voila j'espère que vous pourrez éclairer ma petite lanterne !!

    Cordialement

    P.S : Je programme sous windows

  2. #2
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Bonjour,

    Il me semble qu'il y a quelques petites erreur sur la façon de construire la requete :

    Tout d'abord, le QHttpRequestHeader est plus du type GET que POST, étant donné que l'on envoi une requête et que l'on attend une réponse.

    Ensuite la requête est construite via un QUrl dans lequel on précise un certain nombre de paramètres. Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    QUrl query;
    query.setQueryDelimiters('=', '&');
    query.setPath("/check");
    query.addQueryItem("uploaded_file", "<chemin vers le fichier>");
     
    QHttpRequestHeader header("GET", query.toString());
    header.setValue("Host", "validator.w3.org");
     
    http->setHost("validator.w3.org");
    http->head(query.toString());
    http->request(header);
    Ca me semble être un bon début...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Bonjour et merci pour votre réponse ,j 'aurais cependant quelques petites question à vous poser :

    Je dois également envoyer le contenu de mon fichier, cela ne pose t'il pas de problème de passer la méthode GET ? Cela signifie que je dois également passer tout le contenu dans l'url ... si le fichier est gros je pense que cela pose problème. Il me reste le choix de le passer dans l'en tête mais du coup je ce comprends pas trop comment cela peut fonctionner

  4. #4
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    De ce que j'ai pu comprendre de l'api w3c, l'item "uploaded_file" va justement prendre comme valeur le chemin vers le fichier et non le contenu.

    Ensuite je me suis un peu plus renseigné sur la façon de faire et, mea-culpa, c'est bien une requête POST. Et le contenu du fichier devrait se trouver dans le QHttpRequestHeader

    La base ressemblerait donc plus à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    QUrl query;
    query.setQueryDelimiters('=', '&');
    query.setPath("/check");
    query.addQueryItem("uploaded_file", "<nom du fichier>");
     
    QHttpRequestHeader header("POST", query.toString());
    header.setValue("Host", "validator.w3.org");
    header.setValue("Content-type", "multipart/form-data");
     
    http->setHost("validator.w3.org");
    http->head(query.toString());
    http->request(header);
    Il ne reste plus qu'à trouver comment inclure le contenu d'un fichier dans le header...

    Sinon je viens de voir ça :
    http://qt.developpez.com/doc/4.5/qnetworkaccessmanager/

    Les fonctions put() et post() devraient répondre au problème...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Bonsoir ,

    Je viens d' effectuer quelques test à partir de vos recommandations, voici mes conclusions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QHttpRequestHeader header("POST", query.toString());
    header.setValue("Host", "validator.w3.org");
    header.setValue("Content-type", "multipart/form-data");
    http->setHost("validator.w3.org");
    http->request(header);
    Le Header que je reçois m'annonce Bad Request

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QHttpRequestHeader header("POST", "/check");
    header.setValue("Host", "validator.w3.org");
    header.setValue("Content-type", "multipart/form-data");
    http->setHost("validator.w3.org");
    http->head(query.toString());
    http->request(header);
    Le Header que je reçois m'annonce Bad Request Données non valides

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QHttpRequestHeader header("POST", "/check");
    header.setValue("Host", "validator.w3.org");
    header.setValue("Content-type", "multipart/form-data");
    http->setHost("validator.w3.org");
    http->request(header);
    Le Header que je reçois m'annonce Ok.

    J'en déduis que ce que j'ai fait jusque la n'est pas totalement faux, surtout que je me suis inspiré d'un code vu sur le net et censé marcher. C'est vraiment un problème de réception de données(pour mon code de base ..) ou alors j'ai raté un truc.

    Du coup je me pose une question : je reçois tout le temps une Unknown Error, cela peut il venir du routeur que j'utilise ? Je suis en cité universitaire et je n'ai que très peu de ports ouvert (même pas le droit au 21...) . Et cela peut-il influer sur la réception des données ? Je ne pense pas je spécifie à la requête de passer par le port 80...

    Je rame, je rame ...

    Je n'ai pas eu le temps de tester la classe QNetworkAccessManager, je vous tiens informer dès que j'avance la-dessus.

    En attendant si vous ou quelqu'un d'autres pouvez me renseigner un tant soit peu, j'en serais ravi

    Cordialement

  6. #6
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Je ne pense pas que ça puisse venir d'un problème de routeur, étant donné que les requêtes passent aux travers du port 80.
    Comme demain j'ai une petite journée, je regarderai ça...

  7. #7
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Bonjour,

    Je suis un reparti du début (ce que j'aurai dû faire dés le départ...)

    Effectivement l'ensemble communiquant est correct.
    Le problème d'écriture dans le fichier vient du fait que lorsque "http" va écrire dans le fichier, l'appel ne viendra plus de "Editeur::validation()" et la référence vers le fichier sera perdue.

    Il faut donc créer dans la classe Editeur un pointeur vers un QFile, l'instancier et l'utiliser dans l'appel.

    Ci joint ce que j'ai fait.

    Par contre je n'arrive pas ajouter l'argument "output=soap12" qui permettra d'avoir un résultat sous forme xml...
    Fichiers attachés Fichiers attachés

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Pourquoi un pointeur sur un QFile et un QHttp?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Pourquoi un pointeur sur un QFile et un QHttp?
    Pour le QByteArray et le QHttp je pense?

    Pour le QByteArray c'était pour des test mais je l'ai enlevé, pour le QHttp.. je sais pas un réflexe, je peux le mettre en QHttp tout simplement

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Par défaut
    Bonsoir,

    C'est encore moi (et oui quand on est mauvais) !

    Maintenant que l'API pour la validation HTML me laisse tranquille celle pour la validation CSS me pose des problèmes ... on la trouve ici

    Voici mon code :
    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
    fichier.setFileName("outCSS.xml");
    fichier.open(QIODevice::ReadWrite | QIODevice::Text);
    QByteArray bytes;
    bytes.append("table");
    bytes.append("{");
    bytes.append("border-collapse:collapse;");
    bytes.append("}");
     
    QHttpRequestHeader headerP("POST", "/css-validator/validator");
    headerP.setValue("Host", "jigsaw.w3.org");
    headerP.setContentType("application/x-www-form-urlencoded");
    bytes =  QUrl::toPercentEncoding("text=" + bytes);
     
    requeteCSS->setHost("jigsaw.w3.org", 80);
    requeteCSS->request(headerP,bytes, &fichier);
    Ca c'est le dernier bout de code que j'ai testé, et il me semble pas trop trop mal donc je le poste... j'en ai testé plusieurs depuis 3-4h mais le serveur ne me renvoie qu'une seule réponse : 500 Internal Server Error .. et la je craque vu que j'arrive pas du tout à voir d'ou cela peut venir

    Donc voila si une âme charitable pouvait à nouveau m'eclairer sur ce problème, je lui en serais reconnaissante

    Cordialement

    P.S : Promis c'est la dernière fois que je vous embêtes avec le QHttp ^^

  11. #11
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Bonsoir,

    Comme son nom l'indique, "500 Internal Server Error" l'erreur est interne au serveur avec le tu communique soit "jigsaw.w3.org". Le problème vient de chez eux...

Discussions similaires

  1. [XHTML] Validation W3C
    Par Mister Nono dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/12/2005, 14h34
  2. [HTML] URLs avec variable et validation W3C
    Par pirouette_07 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 11/10/2005, 11h27
  3. validation w3c et javascript: erreur?
    Par stoyak dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/08/2005, 14h59
  4. [HTML / Viewpoint / Valid W3C] Problème de lecture
    Par zebden dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/02/2005, 11h15

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