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

C++/CLI Discussion :

Service web REST et c++


Sujet :

C++/CLI

Vue hybride

toopac Service web REST et c++ 28/05/2010, 12h17
koala01 Salut, Plutôt que... 28/05/2010, 12h53
toopac J'ai du mal m'exprimer...dsl... 28/05/2010, 13h22
koala01 Mais la question que je me... 28/05/2010, 15h36
3DArchi Salut, Nativement, il n'y a... 28/05/2010, 20h31
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut Service web REST et c++
    Bonjour,

    J'ai créé une application en C++ qui me permet de détecter les changements dans un répertoire.

    Le but est d'en notifier ensuite un serveur.

    Je n'arrive pas à trouver comment envoyer un xml à mon serveur (php) via un service web REST.

    xml du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Changement>
        <type/>
        <date/>
        <localisation/>
        <ancien_nom/>
        <nouveau_nom/>
    </changement>
    Pouvez vous me dire comment faire, ou me mettre sur la piste? Merci!

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Plutôt que d'essayer d'envoyer tout le fichier xml au serveur, pourquoi n'essaie-tu pas, tout simplement, d'envoyer une requete "GET" ou "POST" à une page php particulière qui se chargerait, elle, de rajouter l'information directement sur le serveur

    En effet, on peut estimer qu'il y aura de nombreuses modifications du dossier, autrement, tu n'essaierais pas de les détecter .

    Si tu ajoute des informations dans un fichier local et que tu essaie de l'envoyer vers un serveur à chaque fois, tu va te trouver dans une situation dans laquelle tu va... envoyer un fichier de plus en plus gros, alors que, en définitive, la seule différence entre le fichier qui se trouve en local et le fichier qui se trouve sur le serveur tient dans... la dernière modification apportée au dossier.

    Tu économisera donc énormément ta bande passante et ton volume de transfert si, au lieu d'envoyer le fichier complet à chaque fois, tu n'envoie que... les informations relatives à la dernière modification

    En gros, si tu essayais de transmettre ces informations a mano à chaque fois au serveur, tu lui enverrais sans doute un formulaire proche de
    Code HTML : 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
    <form id="form1" name="form1" method="post" action="">
        <label for="type">type</label>
        <select name="type" id="type">
          <option>ajout fichier</option>
          <option>suppression fichier</option>
          <option>changement de nom</option>
          <option>ajout dossier</option>
          <option>suppression dossier</option>
        </select>
        <label for="date">date</label>
        <input type="text" name="date" id="date" />
        <label for="localisation">localisation</label>
        <input type="text" name="localisation" id="localisation" />
        <label for="ancien">ancien nom</label>
        <input type="text" name="ancien" id="ancien" />
        <label for="nouveau">nouveau nom</label>
        <input type="text" name="nouveau" id="nouveau" />
      <input type="submit" name="Envoyer" id="Envoyer" value="Envoyer" />
    </form>
    Et ce serait ton code php qui utiliserait les valeurs renvoyées par ce formulaire pour rajouter les parties correspondantes dans sa version du fichier xml.

    Ce que je te conseillerais donc de faire, c'est de créer une requete HTML qui... agisse exactement comme si tu avais toi-même cliqué sur le bouten "Envoyer"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    J'ai du mal m'exprimer...dsl

    En fait à chaque modification j'envoie au service web REST le xml contenant les infos de la modification.
    exemple : si qqn renomme le fichier toto.txt en tata.txt, j'envoie immédiatement
    le xml suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <modification>
        <type>renommage</type>
        <date>28-05-10 13:20:00</date>
        <localisation>C:/MonDossier</localisation>
        <ancien_nom>toto.txt</ancien_nom>
        <nouveau_nom>tata.txt</nouveau_nom>
    </modification>
    Je sais envoyer un xml à un service web REST en Flex par exemple, ça donne ça (peut être plus clair que ce que je raconte^^):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var service:HTTPService=new HTTPService();
    service.resultFormat=HTTPService.RESULT_FORMAT_XML;
    service.url=urlWebService; //exemple http://www.domaine.fr/rest/modificationREST
    service.addEventListener(ResultEvent.RESULT, onResult);
    service.addEventListener(FaultEvent.FAULT, onFault);
    service.send(xmlAEnvoyer);//voir plus haut
    mais c'est ça que je ne sais pas comment faire en c++...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Mais la question que je me pose, c'est: pourquoi envoyer l'information sous la forme d'un fichier xml, alors que php serait parfaitement en mesure de... créer un tel fichier directement sur le serveur sur lequel il s'exécute

    L'un dans l'autre, tu dois, de toutes manières, envoyer un requête au serveur php, et tu envoie donc déjà une en-tête html.

    Pourquoi ne pas, directement, envoyer les information "brutes" à php, à charge pour lui de les traiter de manière adéquate, plutôt que d'envoyer, en plus de l'en-tête html, un fichier qui implique la transmission de données supplémentaires tout à fait inutiles car... potentiellement ajoutables directement par php?

    Cela permettrait en outre de simplifier les choses si, par la suite, tu voulais modifier la manière dont les informations sont maintenues sur le serveur:

    Si tu envoies directement un fichier xml et que tu décide de rajouter des informations, tu devra modifier ton application, et veiller à ce que chaque copie de celle-ci soit mise à jour (pour éviter l'envoi d'information "au mauvais format")

    Si tu envoies simplement les données brutes, tu n'as qu'à modifier la manière dont php les gère, et la modification est prise en compte de manière totalement transparente pour les différents clients (comprend: pour toute personne utilisant une copie de ton application )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Nativement, il n'y a rien en C++ pour envoyer des requêtes HTTP.
    Tu peux passer par libCurl qui je crois gère cette pile.
    Qt doit bien avoir de quoi faire aussi, avec ça peut être;
    Les MFC ont aussi des choses pour ça il me semble.
    Et côté wxWidget, il y a un wxHTTP qui espérons-le porte bien son nom.
    Côté boost, je crois que pour l'instant il n'y a rien. Mais ceci serait en préparation ?

  6. #6
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    @koala01 : je comprends tes interrogations, mais je fais ce qu'on me demande de faire... Sinon je serai plutôt partit sur du C# pour faire du .NET que de c++ par exemple...
    De toute façon si il y a une modification par minute ça sera déjà énorme.

    @3DArchi : merci pour tes liens, qui m'ont finalement mis sur la voie.
    J'utilise la classe HttpRequest et ça fonctionne très bien.

    Au final je laisse le code que j'ai fais (ou plutôt assemblé avec des morceaux pris à droite à gauche) :


    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
    59
    60
    61
    #include "RestWS.h"
     
    #using <System.dll>
     
    using namespace System;
    using namespace System::IO;
    using namespace System::Net;
    using namespace System::Text;
     
     
    RestWS::RestWS()
    {
    }
     
    void RestWS::Send(String^ xml)
    {
       String^ url = "http://monDomaine/index.php/rest/WsREST";
     
       HttpWebResponse^ response;
       StreamReader^ sr;
     
       try
       {
          //création du HttpWebRequest
          HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(WebRequest::Create(url));
     
          //définition de la méthode
          request->Method = "POST";
     
          //on convertit les données à envoyer 
          ASCIIEncoding^ encoding = gcnew ASCIIEncoding;
          array<Byte>^ dataToSend = encoding->GetBytes( xml );
     
          // définition du type de contenu des données à envoyer
          request->ContentType = "application/xml";
          //request->ContentType = "application/x-www-form-urlencoded";
     
          //définition de la taille du contenu à envoyer
          request->ContentLength = dataToSend->Length;
     
          //on ajoute les données à envoyer
          Stream^ writeStream = request->GetRequestStream();
          writeStream->Write( dataToSend, 0, dataToSend->Length );
          writeStream->Close();
     
          response = dynamic_cast<HttpWebResponse^>(request->GetResponse());
          sr = gcnew StreamReader(response->GetResponseStream());
          String^ result = sr->ReadToEnd();
       }
       catch (Exception^ e)
       {
          //
       }
       finally
       {
          if (response !=nullptr)
             response->Close();
          if (sr != nullptr)
             sr->Close();
       }
    }
    Merci à tous les deux pour votre aide!

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

Discussions similaires

  1. [Aide] Service web RESt et SOAP
    Par brixou dans le forum Services Web
    Réponses: 0
    Dernier message: 22/02/2011, 10h11
  2. [1.x] Services web REST et insertion de données
    Par gavelin dans le forum Symfony
    Réponses: 1
    Dernier message: 20/09/2010, 12h27
  3. Service web REST en VB.NET Hey!Spread
    Par hbhhhbhh dans le forum Services Web
    Réponses: 0
    Dernier message: 21/05/2010, 14h54
  4. Implémenter un service web RESTful en Java
    Par Arnaud_03 dans le forum REST
    Réponses: 4
    Dernier message: 21/04/2009, 18h06
  5. Implémenter un service web RESTful
    Par Arnaud_03 dans le forum Services Web
    Réponses: 4
    Dernier message: 21/04/2009, 18h06

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