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

Web & réseau Delphi Discussion :

Web Services - Problème de communication serveur/client


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut Web Services - Problème de communication serveur/client
    bonjour,

    je suis en train de créer une application web services avec un coté serveur et un coté client.
    le client doit envoyé des requêtes au serveur pour que celui-ci les enregistre dans une BD.

    j'ai défini des fonctions que le client a le droit de se servir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function TestEnvoiRequete (const Process_id, 
      login, 
      pwd, 
      pf_emission, 
      pf_destination, 
      nom_fichier, 
      rq_type: string; 
      need_editing : integer) : String;stdcall;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TestEnvoiRequete3 (const Process_id, 
      login, 
      pwd, 
      pf_emission, 
      pf_destination, 
      nom_fichier, 
      rq_type: string; 
      need_editing : integer;
      const element : TRequestElement) : String;stdcall;
    il s'agit donc de 2 fonctions similaires, avec un objet TRequestElement en plus dans la seconde.
    l'objet TRequestElement est definit dans une unité a part comme ceci:

    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
    type
      TRequestElement = class(TObject)
      private
        FRang               : integer;
        FTypeContenu        : WideString;
        FIdChaine           : WideString;
        FFormat             : WideString;
        FVersion            : WideString;
        FAffaireProgramme   : WideString;
        FDateDiffusion      : WideString;
      protected
      public
        constructor Create;
        destructor Destroy; override;
      published
        property AffaireProgramme : WideString    read FAffaireProgramme  write FAffaireProgramme;
        property Version          : WideString    read FVersion           write FVersion;
        property Format           : WideString    read FFormat            write FFormat;
        property TypeContenu      : WideString    read FTypeContenu       write FTypeContenu;
        property IdChaine         : WideString    read FIdChaine          write FIdChaine;
        property DateDiffusion    : WideString    read FDateDiffusion     write FDateDiffusion;
        property Rang             : integer       read FRang              write FRang;
      end;
    pour créer mon client j'ai utilisé l'importateur wsdl de delphi qui m'a resorti :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    unit IMyWs1;
     
    interface
     
    uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns, Dialogs;
     
    type
     
      // ************************************************************************ //
      // Les types suivants mentionnés dans le document WSDL ne sont pas représentés
      // dans ce fichier. Ce sont soit des alias[@] de types représentés ou alors ils sont 
      // référencés mais jamais[!] déclarés dans ce document. Les types de la dernière catégorie
      // sont en principe mappés à des types Borland ou XML prédéfinis/connus. Toutefois, ils peuvent aussi
      // signaler des documents WSDL incorrects n'ayant pas réussi à déclarer ou importer un type de schéma.
      // ************************************************************************ //
      // !:string          - "http://www.w3.org/2001/XMLSchema"
      // !:dateTime        - "http://www.w3.org/2001/XMLSchema"
      // !:int             - "http://www.w3.org/2001/XMLSchema"
     
      TRequestElement      = class;                 { "urn:URequestObject" }
     
     
     
      // ************************************************************************ //
      // Espace de nommage : urn:URequestObject
      // ************************************************************************ //
      TRequestElement = class(TRemotable)
      private
        FAffaireProgramme : WideString;
        FVersion          : WideString;
        FFormat           : WideString;
        FTypeContenu      : WideString;
        FIdChaine         : WideString;
        FDateDiffusion    : WideString;
        FRang             : Integer;
      public
        destructor Destroy; override;
      published
        property AffaireProgramme: WideString  read FAffaireProgramme  write FAffaireProgramme  stored False;
        property Version: WideString           read FVersion           write FVersion           stored False;
        property Format: WideString            read FFormat            write FFormat            stored False;
        property TypeContenu: WideString       read FTypeContenu       write FTypeContenu       stored False;
        property IdChaine: WideString          read FIdChaine          write FIdChaine          stored False;
        property DateDiffusion: WideString     read FDateDiffusion     write FDateDiffusion     stored False;
        property Rang: Integer                 read FRang              write FRang              stored False;
      end;
     
      // ************************************************************************ //
      // Espace de nommage : urn:UMyWsIntf-IMyWs
      // soapAction : urn:UMyWsIntf-IMyWs#%operationName%
      // transport : <a href="http://schemas.xmlsoap.org/soap/http" target="_blank">http://schemas.xmlsoap.org/soap/http</a>
      // style     : rpc
      // liaison   : IMyWsbinding
      // service   : IMyWsservice
      // port      : IMyWsPort
      // URL       : <a href="http://192.168.2.133/cgi-bin/wssoap.exe/soap/IMyWs" target="_blank">http://192.168.2.133/cgi-bin/wssoap.exe/soap/IMyWs</a>
      // ************************************************************************ //
      IMyWs = interface(IInvokable)
      ['{A71CD1DD-5536-F2FD-2679-7146738EBED6}']
        function  TestEnvoiRequete(const Process_id: WideString; const login: WideString; const pwd: WideString;
                  const pf_emission: WideString; const pf_destination: WideString; const nom_fichier: WideString;
                  const rq_type: WideString; const need_editing: Integer): WideString; stdcall;
     
        function  TestEnvoiRequete3(const Process_id: WideString; const login: WideString; const pwd: WideString;
                  const pf_emission: WideString; const pf_destination: WideString; const nom_fichier: WideString;
                  const rq_type: WideString; const need_editing: Integer;
                  const element: TRequestElement): WideString; stdcall;
     
      end;
     
    function GetIMyWs(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IMyWs;
     
     
    implementation
     
    function GetIMyWs(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IMyWs;
    const
      defWSDL = 'http://192.168.2.133/cgi-bin/wssoap.exe/wsdl/IMyWs';
      defURL  = 'http://192.168.2.133/cgi-bin/wssoap.exe/soap/IMyWs';
      defSvc  = 'IMyWsservice';
      defPrt  = 'IMyWsPort';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as IMyWs);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
     
    destructor TRequestElement.Destroy;
    begin
      inherited Destroy;
    end;
     
    initialization
      InvRegistry.RegisterInterface(TypeInfo(IMyWs), 'urn:UMyWsIntf-IMyWs', 'utf-8');
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IMyWs), 'urn:UMyWsIntf-IMyWs#%operationName%');
      RemClassRegistry.RegisterXSClass(TRequestElement, 'urn:URequestObject', 'TRequestElement');
    end.
    maintenant dans la form de mon applicatiojn cliente, j'ai un bouton sur lequel j'effectue l'appel de la fonction TestEnvoiRequete3
    comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.BtInsertClick(Sender: TObject);
    var
      tempElement : TRequestElement;
      tp : string;
    begin
      tempElement := GBL_ElementList[0];
      tp := GetIMyWs.TestEnvoiRequete3(EdProcessId.Text, EdUser.Text, EdPwd.Text,
        EdPF_Emission.Text, EdPF_Destination.Text, EdNom_Fichier.Text, EdType.Text,
        strToInt(EdNeed_Editing.Text), tempElement);
     
      Memo.Lines.Add(tp);
    end;

    mon pb intervient a ce niveau là.
    tous les champs sont remplis, et l'objet "tempElement" n'est pas vide, mais à la reception de la fonction coté serveur, les attributs strings
    ont les bonnes valeurs, alors que l'objet de type TRequestElment lui est NIL et je sais pas pourquoi ni comment faire pour rectifier ça.

    je solicite donc votre aide.
    merci d'avance

  2. #2
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut et bienvenue dans les forums de Developpez.com !

    • Merci d'utiliser les balises [CODE] pour ajouter du code dans un post

    • Regarde DELPHP, ça pourrait t'intérresser, et aussi ce sujet par exemple...

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Je pense qu'il faille que tu créés avant ton élément.

    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
     
    procedure TForm1.BtInsertClick(Sender: TObject);
    var
      tempElement : TRequestElement;
      tp : string;
    begin
      TempElement := TRequestElement.Create;
      try
        tempElement := GBL_ElementList[0];
        tp := GetIMyWs.TestEnvoiRequete3(EdProcessId.Text, EdUser.Text, EdPwd.Text,
        EdPF_Emission.Text, EdPF_Destination.Text, EdNom_Fichier.Text, EdType.Text,
        strToInt(EdNeed_Editing.Text), tempElement);
     
        Memo.Lines.Add(tp);
      finally
        TempElement.free;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut
    merci pour ton aide mais j'ai déjà essayé de créer l'objet avant l'envoi, mais le résultat est toujours le meme ...

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Chose que je trouve bizarre et qui risque t'apporter des ennuis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TRequestElement = class(TObject)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TRequestElement = class(TRemotable)
    Je ne pense pas que cela fasse bon menage d'avoir 2 classes différentes avec un même nom.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut
    le truc c'est que la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRequestElement = class(TRemotable)
    ce n'est pas moi qui l'ai créée,
    elle l'a été au moment où j'ai utilisé l'importateur wsdl, pour créer le client. et c'est pour ça qu'elle hérite de "TRemotable" et à mon avis le pb vient de par là.
    En effet cette classe a été créer pour permettre au client de réutiliser les mêmes objets, je pense qu'elle est nécessaire mais je pense aussi qu'il me manque qqle chose mais je ne sais pas quoi.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut Problème similaire (Webservice et passage classe en parametre)
    Bonjour,

    Moi aussi je rencontre le même genre de problème , j'ai besoin de passer en parametre une classe non scalaire lors d'un appel de fonction d'un client vers un serveur web via HTTPRIO.

    Elle est déclarée en TRemotable côté client (suite à l'import du WSDL) mais comme elle n'a pas été crée en Delphi (en C++) côté server je ne sais pas si elle a été crée en équivalent.

    Par contre j'arrive à executer la requête Subscribe avec le petit soft WebServiceStudio qui pointe vers le même WSDL.

    Voici le code cote client :
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      srResult:TSubscribeResult;
      sFilter : String;
      iuri:WideString;
      itypename:WideString;
    begin
        // création de l'objet non scalaire Subscriber
        srSubscriber := Subscriber.Create() ;
        srSubscriber.ConsumerPort := 0 ;
        srSubscriber.ConsumerHost := 'a';
        srSubscriber.Identifier := '1111' ;
     
        sFilter := 'filtre scaliare';
     
        // création de l'objet résultat de l'appel
        srResult := TSubscribeResult.Create;
        srResult.ResultStatus := TResultStatus.create;
     
        // récup des infos de registration de la classe Subscriber
        RemClassRegistry.GetXSDInfoForClass(TypeInfo(Subscriber),iuri, itypename ) ;
        ShowMessage('Subscriber '  + iuri + ' : ' +  itypename ) ;
     
        srResult := (HTTPRIOOperationSubscriptionService2008 as OperationSubscriptionService2008Soap).Subscribe( (srSubscriber as Subscriber), sFilter);
    ShowMessage('Apres Subscribe '  + GetResultLevel(srResult.ResultStatus.Level) + srResult.ResultStatus.Message ) ;
     
    end;
    Ceci me renvoi comme message : 'Apres Subscribe Error Parametre requis non spécifié Subscriber '
    alors que GetXSDInfoForClass m'a renvoyé les infos sur l'uri et le typename correspondant au RegisterXSClass importé du WSDL
    J'ai le même message d'erreur si je ne fait pas le Create de mon Subscriber.

    Serait il possible qu'il y ait incompatbilité entre la déclaration (en Delphi) côté client et celle en C++ côté server (qui serait traitée par WebServiceStudio)

    et dans ce cas comment le résoudre

    merci pour votre aide ...

    PS : il est quand même étonnant que j'arrive à récupérer le message d'erreur avec sa structure

    suite import wsdl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    initialization
      InvRegistry.RegisterInterface(TypeInfo(OperationSubscriptionService2008Soap), 'http://www.giro.ca/OperationSubscriptionService2008', 'utf-8');
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(OperationSubscriptionService2008Soap), '/OperationSubscriptionService2008/%operationName%');
      RemClassRegistry.RegisterXSClass(Subscriber, 'http://www.giro.ca/OperationSubscriptionService2008', 'Subscriber');
      RemClassRegistry.RegisterXSClass(SubscribeResult, 'http://www.giro.ca/OperationSubscriptionService2008', 'SubscribeResult','',false);

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

Discussions similaires

  1. Web services XML-RPC entre un client Android et un serveur OpenERP
    Par oqastage dans le forum API standards et tierces
    Réponses: 16
    Dernier message: 17/03/2016, 12h39
  2. Problème communication serveur client en socket
    Par thejavator dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 08/02/2014, 16h08
  3. Problème communication serveur/client avec Socket
    Par Nicolas74 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 03/12/2009, 17h54
  4. Web services asynchrone - push server vers client
    Par boulb dans le forum Services Web
    Réponses: 3
    Dernier message: 28/11/2006, 19h51
  5. [servlet][http] communication serveur/client
    Par amel666 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 03/02/2006, 08h05

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