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

  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 : 37
    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
    Points : 2 913
    Points
    2 913
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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"

  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 : 37
    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
    Points : 2 913
    Points
    2 913
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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 )

  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
    Points : 13 017
    Points
    13 017
    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 : 37
    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
    Points : 2 913
    Points
    2 913
    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!

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par toopac Voir le message
    @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.
    Il faut parfois accepter de ne pas simplement jouer au "brave petit soldat"...

    Quand on te demande quelque chose qui te semble, définitivement, aberrant, il y a deux manières de réagir:

    Soit tu estimes que "c'est l'autre le boss" et tu te casse la tête pour faire ce que l'on te demande, comme un brave mouton que l'on mène à l'abattoir

    Soit tu relève l'aberration, et tu détends ton point de vue, sans oublier qu'il dispose peut être d'information qu'il n'a pas à te transmettre.

    Après tout, même si la règle du chef sont:
    • art. 1 le chef a toujours raison
    • art. 2 le chef n'a jamais tord
    • art. 3 en cas de doute, se reporter aux articles 1 et 2
    tu peux peut être attirer son attention sur des problèmes qu'il n'avait pas envisagé (une modification à la minute, sur 10 pc, ca peut aller... mais quid lorsque l'on passer à ... 100 ou à 1000 pc)

    Après, c'est au chef de choisir: soit (on peut l'espérer malgré tout ) il accepte tes arguments et revoit sa copie, et tu évites de te faire du mal pour rien, soit, il s'obstine dans la voie qu'il t'a indiquée, et ben... tu fais ce qu'il a dit (et tant pis pour lui si tu prends du retard )

    Personnellement, je crois que j'insisterais lourdement sur le problème que peut représenter le fait d'avoir en local une gestion qu'il serait largement préférable d'effectuer sur le serveur... mais je n'y peux rien: il n'est vraiment pas dans mon tempérament de fermer ma grande gu...e devant ce qui me semble aberrant

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    Salut Toopac,
    Ta solution par HttpRequest me semble pas trop mal.. Mais le code que tu as mis sur Internet c'est pas du C# des fois ?
    Merci,
    Alexis

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 166
    Points : 12 284
    Points
    12 284
    Par défaut
    Otez moi d'un doute, on est bien dans C++/CLI.
    Toutes les classes .NET sont accessibles directement depuis C++/CLI, donc si vous savez le faire en C#, vous savez le faire en C++/CLI

    Mais l'inverse est faux à cause des trucs non-managés de C++/CLI.

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Otez moi d'un doute, on est bien dans C++/CLI.
    En tout cas on n'est bien dans le forum C++/CLI car il me semble que c'est le cas du code source proposé.

+ 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