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 :

Utiliser web service via Delphi


Sujet :

Web & réseau Delphi

  1. #1
    Membre habitué
    Utiliser web service via Delphi
    Bonjour,

    Je suis en train de tester la connexion via Web service vers une Platform qui fournit cette possibilité j’ai converti l’XML qui me permet d’utiliser les fonctions de la connexion et d’échange d’informations en unit sur Delphi mais j’ai pas pu fonctionné la première requête de m’application vers le server une erreur se produise « Acces violation at address…. »

    J’ai fait la même chose sur l’utilitaire SoapUI et ca fonctionne parfaitement

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ses="http://www.nortel.com/soa/oi/cct/types/SessionService" xmlns:typ="http://www.nortel.com/soa/oi/cct/types">
       <soapenv:Header/>
       <soapenv:Body>
          <ses:LogInToCCTServerRequest>
             <ses:authenticationLevel>
                <typ:username>My_User</typ:username>
                <typ:password>My_Password</typ:password>
                <typ:domain>My_Domain</typ:domain>
             </ses:authenticationLevel>
          </ses:LogInToCCTServerRequest>
       </soapenv:Body>
    </soapenv:Envelope>


    Quelqu’un a une aidé comment je peux régler cette anomalie ?

    Cdt.

  2. #2
    Expert éminent sénior
    Le contenu du SOAP ne va pas nous être d'un grand secours pour le moment
    Il faut commencer par générer le Wrapper à partir du WSDL, il fournit une interface et des objets TRemotable et l'instanciation du HTTPRIO (je suppose que c'est ce que vous appelez "j’ai converti l’XML en unit ")

    Le problème est clairement l'utilisation incorrecte d'un objet
    Soit non alloué
    Soit une mauvais libération
    Sans le code Delphi, je ne vois pas ce que l'on peut répondre à cela
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué
    le voici le code Delphi:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
    CCT_connect:LogInToCCTServerRequest;
    resp:LogInToCCTServerResponse;
    username,password,domain:string;
     
    begin
    CCT_connect.authenticationLevel.username:='My_User';
    CCT_connect.authenticationLevel.password:='My_password';
    CCT_connect.authenticationLevel.domain:='my_domain';
    end;

  4. #4
    Expert éminent sénior
    CCT_connect n'est pas instancié ?
    Surement une fonction GetLogInToCCTServerRequest qui doit être dans l'unité Wrapper généré

    Je pense qu'il faudrait revoir d'abord les bases de Delphi sur le cycle de vie des objets et des interfaces (IRemotable) avant de vouloir utiliser un WebService
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre habitué
    C'est la première fois que j'utilise le web service avec Delphi j'ai fait un changement sur mon code mais j'obtenu une erreur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      aut:LogInToCCTServerRequest;
    begin
     
      (HTTPRIO1 as UserService).LogInToCCTServer(aut);
      aut.authenticationLevel.username:='username';
      aut.authenticationLevel.password:='v';
      aut.authenticationLevel.domain:='domain';


    l'erreur :

  6. #6
    Expert éminent sénior
    Dans le fichier PAS généré à partir du WSDL, il y a déjà une factory qui instancie un THTTRIO et retourne une interface prête à l'emploi
    Votre problème n'est pas lié au WebService en Delphi mais à votre connaissance de base du langage Delphi
    Vous n'avez toujours pas instancié l'objet utilisé, cela ne peut qu'échouer

    Votre code devrait ressemble à quelque chose comme ça
    Evidemment, n'ayant pas tous les éléments ma réponse ne peut être qu'approximative
    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
     
    var
      aut:LogInToCCTServerRequest;
      resp:LogInToCCTServerResponse;
    begin
      aut := LogInToCCTServerRequest.Create();
      try
        aut.authenticationLevel.username:='username';
        aut.authenticationLevel.password:='v';
        aut.authenticationLevel.domain:='domain';
        resp := (HTTPRIO1 as UserService).LogInToCCTServer(aut);
        try
          // utilisation de resp
        finally
          resp.Free();
        end;
      finally
        aut.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre habitué
    Merci ShaiLeTroll pour le feedback mais j’ai toujours cette erreur de violation lors la création d'objet :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
      aut := LogInToCCTServerRequest.Create();

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LogInToCCTServerRequest = class(LogInToCCTServerRequest2)
      private
      published
      end;
     function  LogInToCCTServer(const parameters: LogInToCCTServerRequest): LogInToCCTServerResponse; stdcall;



  8. #8
    Expert éminent sénior
    Je pense qu'il faut que vous fassiez du nettoyage dans le fichier généré
    Il faut chercher à déboguer votre code, je ne peux que donner des pistes puisque je n'ai rien de concret

    une violation d'accès en 0000000C c'est à cause d'un objet nil et l'on accéde à propriété/méthode en début de la table d'adresse de la classe
    Que contient le constructeur Create de LogInToCCTServerRequest2 ?

    Faudrait peut-être solliciter le support Avaya qui fournit le SDK Nortel
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre habitué
    Bonjour,

    Citation Envoyé par ShaiLeTroll Voir le message

    Que contient le constructeur Create de LogInToCCTServerRequest2 ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor LogInToCCTServerRequest2.Create;
    begin
      inherited Create;
      FSerializationOptions := [xoLiteralParam];
    end;

    Pour le support Avaya ont des exemples crée par Java ,et j'ai connais un développer qui a réussi à connecter on utilisant Python
    le but de cette intégration est de contrôler un softphone via third party
    Code Pascal :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
     
    var
      aut:LogInToCCTServerRequest;
      resp:LogInToCCTServerResponse;
      username,password,Domain:authenticationLevel;
    begin
        HTTPRIO1.service   := 'SOAOICCT_UserService';
        HTTPRIO1.port      := 'UserService' ;
        HTTPRIO1.URL       := 'http://172.17.8.17:9080/SOAOICCT/services/UserService';
     
        aut:=LogInToCCTServerRequest.Create ;
        resp:= LogInToCCTServerResponse.Create;
        username:=authenticationLevel.Create;
        password:=authenticationLevel.Create;
        Domain:=authenticationLevel.Create;
      try
         username.username:='username';
         password.password:='password';
         Domain.domain:='domain';
    //**************************************************************************************
         resp := (HTTPRIO1 as UserService).LogInToCCTServer(aut);   // J'ai une erreur ici " Fault occurred while processing "
    //**************************************************************************************
        try
          // utilisation de resp
     
          ShowMessage(resp.ssoToken.token);
        finally
          resp.Free();
        end;
      finally
        aut.Free();
        resp.Free();
        username.Free();
        password.Free;
        Domain.Free;
      end;
    end;



  10. #10
    Expert éminent sénior
    resp ne doit pas être instancier, il doit même y avoir un avertissement
    Car lors du resp := (HTTPRIO1 as UserService).LogInToCCTServer cela perd la première instance de resp et génére une fuite mémoire

    Pourquoui username, password et Domain ne sont pas lié à auth ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Expert éminent sénior
    Sans tester, je ferais cela

    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
    var
      aut:LogInToCCTServerRequest;
      resp:LogInToCCTServerResponse;
    begin
        HTTPRIO1.service   := 'SOAOICCT_UserService';
        HTTPRIO1.port      := 'UserService' ;
        HTTPRIO1.URL       := 'http://172.17.8.17:9080/SOAOICCT/services/UserService';
     
      aut :=LogInToCCTServerRequest.Create ;
      try
         aut.authenticationLevel := authenticationLevel.Create; // libérer par la ligne 3867 
     
         aut.authenticationLevel.username:='username';
         aut.authenticationLevel.password:='password';
         aut.authenticationLevel.domain:='domain';
     
         resp := (HTTPRIO1 as UserService).LogInToCCTServer(aut);
         try
            // utilisation de resp
     
            ShowMessage(resp.ssoToken.token);
          finally
            resp.Free();
          end;
      finally
        aut.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre habitué
    Tu es un génie je te tire chapeau
    merci beaucoup une autre fois

  13. #13
    Expert éminent sénior
    De rien, avec le fichier PAS généré, c'était bien plus simple de t'aider
    Tu vas devoir le lire avec attention pour gérer tes instanciations et libérations, voir le modifier pour qu'il soit plus facile à utiliser
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs