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 :

Webservices - connexions via certificats - SOAP - Delphi


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Webservices - connexions via certificats - SOAP - Delphi
    Bonjour à toutes et tous,
    Je recherche la meilleure méthode pour utiliser un Web Service.
    Je travaille sous delphi Rio 10.3 et j'utilise un Web Service qui ne m'appartient pas.
    Je dois réaliser une authentification Basic, j'ai une "action" et un "to" à fournir au wsdl.

    Pourriez-vous me dire s'il existe un composant natif utilisable directement ?
    Auriez-vous des exemples d'utilisation de Web Service sans connexion dans un premier temps ?

    J'ai déjà réalisé quelques tests avec Clever et ses composants et avec Indy (sans certificat).

    J'ai trouvé quelques posts sur le forum mais pas assez d'informations pour moi
    https://www.developpez.net/forums/d9...s-webservices/
    https://www.developpez.net/forums/d8...s-webservices/
    https://www.developpez.net/forums/d1...e-via-httprio/

    Merci beaucoup pour votre aide

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Bonjour,

    je commencerais par Expert d'importation WSDL
    Là c'est une galère pour trouver les bonnes options pour avoir le mapping SOAP qui à la fois standard et tout le temps contourné

    Citation Envoyé par sigiaccio Voir le message
    Je travaille sous delphi Rio 10.3 et j'utilise un Web Service qui ne m'appartient pas.
    Un compte bac à sable serait à réclamer au prestataire

    Citation Envoyé par sigiaccio Voir le message
    Je dois réaliser une authentification Basic, j'ai une "action" et un "to" à fournir au wsdl.
    le WSDL est un descripteur de WS, il n'y a rien à lui fournir, et cela n'a aucun rapport avec authentification Basic qui n'est que le passage du Login+PW encodé en base64 comme entête HTTP
    "action" \ "to" ... sans contexte, cela n'a pas de sens particulier sauf si il c'est une "SOAPAction" qui à l'instar de l'authentification Basic est aussi un entête HTTP


    Citation Envoyé par sigiaccio Voir le message
    Pourriez-vous me dire s'il existe un composant natif utilisable directement ? .
    THTTPRIO et objet TRemotable et THTTPReqResp.ClientCertificate


    Citation Envoyé par sigiaccio Voir le message
    Auriez-vous des exemples d'utilisation de Web Service sans connexion dans un premier temps ?
    Un WebService étant sur un serveur, vous ne faîtes qu'invoquez le WS, donc un mode "sans connexion" ça n'existe pas en dehors de phase initiale de l'utilisation Expert d'importation WSDL et de l'intégration de ce Wrapper de WS dans votre projet
    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 averti

    Profil pro
    Inscrit en
    Février 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 17
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    "action" \ "to" ... sans contexte, cela n'a pas de sens particulier sauf si
    Ca pourrait avoir du sens s'il s'agissait des balises de routage xml "ws-adressing" à rajouter dans l'entête.

    https://docs.intersystems.com/irisla...P_WSADDRESSING

    Ca doit être un effet de mode, elles sont de plus en plus demandées.
    Les balises en question

    To:destination address
    Action: SoapAction
    MessageID: unique uuid
    ReplyTo: anonymous

    sont soit prévues dans le wsdl, soit à implémenter soi même.

    En java cela se fait par un simple annotation, mais en Delphi rien n'existe, il faut les ajouter soi-même dans le header.

    hélas, les informations fournies avec la question sont trop vagues pour se faire une idée précise



    Pour constituer l'entête de sécurité rien n'existe par défaut non plus il faut googler sur WSSE.PAS qui est une unité créé par Bruneau babet d'embarcadero
    et mise à disposition sur les anciens forums il y a fort fort longtemps.

    mais on retrouve des copies un peu partout sur le net en cherchant WSSE.PAS

    https://adhainestech.ca/delphi-soap-and-wsse/
    https://github.com/ronaldhoek/SOAPStuff
    https://forum.delphi.cz/index.php/topic,15329.0.html

    par contre le ws-adressing n'existait pas à l'époque, ça ne fait que l'autentification (et par chance que la basique ^^)


    Sinon pour tout le reste il y a l'outil wsdlimp.exe et le composant standard Thttprio

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Merci
    Citation Envoyé par ShaiLeTroll Voir le message
    Bonjour,

    je commencerais par Expert d'importation WSDL
    Là c'est une galère pour trouver les bonnes options pour avoir le mapping SOAP qui à la fois standard et tout le temps contourné


    Un compte bac à sable serait à réclamer au prestataire


    le WSDL est un descripteur de WS, il n'y a rien à lui fournir, et cela n'a aucun rapport avec authentification Basic qui n'est que le passage du Login+PW encodé en base64 comme entête HTTP
    "action" \ "to" ... sans contexte, cela n'a pas de sens particulier sauf si il c'est une "SOAPAction" qui à l'instar de l'authentification Basic est aussi un entête HTTP



    THTTPRIO et objet TRemotable et THTTPReqResp.ClientCertificate



    Un WebService étant sur un serveur, vous ne faîtes qu'invoquez le WS, donc un mode "sans connexion" ça n'existe pas en dehors de phase initiale de l'utilisation Expert d'importation WSDL et de l'intégration de ce Wrapper de WS dans votre projet
    Merci, je vais regarder à cela et reviens vers vous rapidement avec des solutions ou questions ;-)

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Retour suite aux informations fournies
    Bonjour,

    Voici mes premiers tests sur SOAP ui que j'aimerais répercuter sur delphi RIO.

    • je possède un certificat .pfx avec un mot de passe que je place dans les "keystores".
    • au niveau des "outgoing WS-Security Configurations", je définis une signature avec le keystore (.pfx)

    Dans la signature, j'indique "Issuer Name and Serial Number"
    • l'authenfication est mise sur "Basic"
    • je dois définir des WS-A :
      - Enable WS-A addressing
      - Action : définir une url fournie
      - To : je donne l'url fournie
      - MessageId : génération automatique


    En delphi, j'ai réussi à utiliser le webservice de cadmap avec la fonction getListeCommunes.
    J'arrive à récupérer le nom de la première commune.
    J'utilise le composant TclHttp et TclSoapMessage de Clever.

    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
       request :=
          '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.ws.cadmap.nsi.be/">'+
          '<soapenv:Header/>'+
          '<soapenv:Body>'+
          '<soap:getListeCommunes/>'+
          '</soapenv:Body>'+
          '</soapenv:Envelope>';
     
        clSoapMessage1.BuildSoapMessage(request);
     
      response := clHttp1.Post('http://geoservices.wallonie.be/cadmap/soap/', clSoapMessage1);
     
      dom := CoDOMDocument.Create();
      dom.loadXML(WideString(response));
     
      node := dom.selectSingleNode('//nom');
      if (node <> nil) then
      begin
        edt.Text := string(node.text);
      end;

    Je reviens vers vous dès que j'ai plus de détails.
    Je fournirai le code dès que j'ai trouvé ;-)
    N'hésites pas à me poser des questions.

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    alors sous Delphi en standard tu as WDSLImp, qui est disponible aussi dans l'IDE par Composant/Importer WSDL et qui permet de produire une unité Delphi pour invoquer un WebService SOAP d'après son descriptif (WSDL).

    par contre, il faut bien voir que SOAP c'est un langage de description qui existe en plusieurs versions et qui permet un tas de choses assez complexes qu'il est difficile de traduire en langage de programmation...donc tu peux toujours tomber sur un fichier valide du point de vue de SOAP mais qui merde sous Delphi, mais également sous d'autres langages...tout ce qui est utilisé classiquement ça fonctionne, mais sur certain cas tordus ou simplement peu communs, ça coince.

    je pense que tu parles de WSAddressing en effet, ça au départ c'est pas bien compliqué, c'est juste un entête qu'il faut ajouter dans une syntaxe pas très intuitive dont tu peux trouver des exemples ici.

    si ton certificat et utilisé pour la négociation TLS ça va, mais s'il doit en plus signer la requête, la ça devient compliqué, et ce n'est pas supporté à ce jour par Delphi en standard. Il faut dire que la signature d'une requête SOAP c'est un peu galère, et l'architecture utilisée par Delphi n'est pas assez souple pour permettre de le faire à la volée...à la rigueur il faut le faire dans un second temps juste avant d'envoyer la requête.

    NB: dans les derniers patch 10.4 il y a eu des correctifs sur SOAP, essentiellement des WSDL qui plantaient WSDLImp ou qui donnait des unités qui ne compilaient pas (identifiant non défini...), cela montre que Embarcadero n'a pas laissé tomber SOAP qui est pourtant une vieille techno, surtout utilisée par des administrations qui n'ont pas investi dans de nouvelles technos (REST par exemple).

    Note que j'ai personnellement travaillé sur des WebServices SOAP assez casse pied avec signature avec des certificats self-signed, tout pour plaire, et j'ai préféré coder moi même les fonctions SOAP basées sur de la concaténation.

    au final j'ai par exemple la function soap()
    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
     
    function xmlTag(const Name, Params, Value: UTF8String): UTF8String;
    begin
      Result := '<' + Name;
      if Params <> '' then
        Result := Result + ' ' + Params;
      if Value <> '' then
        Result := Result + '>' + Value + '</' + Name + '>'
      else
        Result := Result + '/>';
    end;
     
    function soap(const Header, Body: UTF8String): UTF8String;
    begin
      // SOAP 1.2
      Result := '<?xml version="1.0" encoding="utf-8"?>'
              + xmlTag('soap:Envelope', 'xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"',
                  xmlTag('soap:Header', '', Header)
                + xmlTag('soap:Body', '', Body)
              );
    end;
    par contre je me paluche la WSDL à la main pour produire le code XML qui va bien, mais du coup je peux produire une portion du XML, en calculer un Hash, le signer, remettre tout cela dans l'entête etc...toujours par de simples concaténations de chaînes.

    idéalement il faudrait pouvoir produire ces fonctions automatiquement d'après le WSDL mais ça j'ai pas.

    mais au final SOAP c'est juste ça, je transforme l'appel d'une méthode d'objet en un code XML qui est plus ou moins complexe, voir encapsulé dans une enveloppe MIME (MTOM) et envoyé en HTTP(s) vers un serveur web qui répond du XML qui contient la réponse codée aussi de façon plus ou moins complexe.

    pour le décodage j'ai créé Execute .XML.Tree qui permet de parser un XML en mémoire, et je vais y piocher les informations qui m'intéresse.

    par exemple, voici le code de détection d'une erreur
    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
     
    function TResponse.SOAPError(xml: PAnsiChar; Len: Integer; var Tree: TXMLTree): Boolean;
    var
      Node: PXMLNode;
    begin
      FError := '';
      try
        Tree.BuildFrom(xml, Len);
      except
        on e: Exception do
        begin
          FError := e.Message;
          Exit(True);
        end;
      end;
      Node := Tree.XPathNode('Envelope/Body/Fault');
      if Node = nil then
        Result := False
      else begin
        FError := string(xmlDecode(Node^['Reason']^['Text'].Value));
        ReportError(Tree.Source);
        Result := True;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Suite
    Bonjour,
    Merci beaucoup pour votre réponse.

    Merci pour le WS adressing, je vais tester.

    Mon certificat doit signer la requête - je continue mes tests...

    Je reviens vers vous dès que j'avance

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Utilisation du composant Clever clHttpRio
    Après plusieurs tests et recherches, voici où j'en suis.

    Un composant Clever fait exactement ce dont j'ai besoin.
    https://www.clevercomponents.com/default.asp

    Voici le lien de la vidéo pour l'explication et les détails techniques.


    Voici un lien vers la description
    https://www.clevercomponents.com/por...ncryption.aspx

    Voici le lien vers le programme de test :
    https://github.com/CleverComponents/...oapSignEncrypt

    Au niveau des WS-adressing de SOAP UI, il faut utiliser la propriété TclSoapMessage.Addressing
    Au niveau des certificats, je les ajoute via la MMC
    https://social.technet.microsoft.com...s-console.aspx

    Je suis actuellement bloqué sur l'erreur suivante :
    raised exception class ERemotableException with message 'Policy Falsified'.

    Certainement un paramètre manquant, je continue à investiguer.

    N'hésitez pas si vous avez une idée

    Merci

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Sinon, pourquoi ne pas utiliser la version REST ?

    Par exemple http://geoservices.wallonie.be/cadma...tListeCommunes

    qui retourne

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    [{"ins":"52074","lang":"F","nom":"Aiseau-Presles","xMin":161513.68280353,"xMax":167659.250768921,"yMin":117315.903702037,"yMax":125337.07583816},
    {"ins":"61003","lang":"F","nom":"Amay","xMin":213303.199108731,"xMax":219533.211483627,"yMin":134372.535415174,"yMax":142794.201744657},
    {"ins":"63001","lang":"Gf","nom":"Ambleve","xMin":271046.223201666,"xMax":286558.268061449,"yMin":109785.627435933,"yMax":123149.709344524},
    {"ins":"92003","lang":"F","nom":"Andenne","xMin":192118.655167217,"xMax":206453.517004074,"yMin":126549.47027855,"yMax":135888.54359664},
    {"ins":"56001","lang":"F","nom":"Anderlues","xMin":139982.321208097,"xMax":144687.497925326,"yMin":118775.475853034,"yMax":124133.923596371},
    {"ins":"91005","lang":"F","nom":"Anhee","xMin":175474.43843832,"xMax":187624.869557145,"yMin":107761.227903415,"yMax":116804.359492628},
    {"ins":"62003","lang":"F","nom":"Ans","xMin":227122.112955003,"xMax":233702.459883886,"yMin":149354.669983841,"yMax":157523.90520661},
    {"ins":"61079","lang":"F","nom":"Anthisnes","xMin":225856.561209583,"xMax":234088.873335805,"yMin":128063.858782819,"yMax":135299.807185023},
    ...
    {"ins":"25112","lang":"F","nom":"Wavre","xMin":161370.877255241,"xMax":169650.730741469,"yMin":152477.193884399,"yMax":161501.70798665},
    {"ins":"63084","lang":"F","nom":"Welkenraedt","xMin":257218.095371738,"xMax":265377.990858687,"yMin":147313.706571075,"yMax":155527.947444194},
    {"ins":"84075","lang":"F","nom":"Wellin","xMin":196007.477893604,"xMax":207976.649916304,"yMin":78545.4519146634,"yMax":90411.0563929565},
    {"ins":"91141","lang":"F","nom":"Yvoir","xMin":184519.984507321,"xMax":196712.860536709,"yMin":107896.893237867,"yMax":117151.723206026}]

    Leur documentation étant bien fichue avec des menus de test : http://geoservices.wallonie.be/cadma...ws/index.xhtml
    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

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Problème résolu
    Bonjour,
    Je dois utiliser un webservice fourni par un fournisseur.

    Cela fonctionne.

    Par rapport à la vidéo youtube, j'ai changé ceci :

    Request.Addressing.AddItem('messageID', 'message_ID', DateToStr(now));

    Au niveau du composant clHttpRio, je ne coche pas Encrypt. Je coche uniquement Sign et SignBeforeEncrypt

    Encore merci pour votre aide précieuse.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Suite par rapport au retour
    Bonjour,

    J'arrive à récupérer les informations du WSDL.
    Mais les variables sont typées par le WSDL :
    published
    property niss: NISSType Index (IS_OPTN) read Fniss write Setniss stored niss_Specified;
    property nom: NomType Index (IS_OPTN) read Fnom write Setnom stored nom_Specified;
    property prenom: PrenomType Index (IS_OPTN) read Fprenom write Setprenom stored prenom_Specified;
    property autrePrenom: Array_Of_PrenomType Index (IS_OPTN or IS_UNBD) read FautrePrenom write SetautrePrenom stored autrePrenom_Specified;
    property sexe: SexeType Index (IS_OPTN) read Fsexe write Setsexe stored sexe_Specified;
    property naissance: NaissanceType Index (IS_OPTN) read Fnaissance write Setnaissance stored naissance_Specified;
    property deces: DecesType Index (IS_OPTN) read Fdeces write Setdeces stored deces_Specified;
    property adresse: AdresseType Index (IS_OPTN) read Fadresse write Setadresse stored adresse_Specified;
    property codeNationalite: string Index (IS_OPTN) read FcodeNationalite write SetcodeNationalite stored codeNationalite_Specified;

    SexeType = (M, F, X);

    Lorsque je souhaite récupérer un type SexeType, je fais ceci
    lblNom.Caption := resultat[0].rnDetails.nom;
    lblSexe.Caption := resultat[0].rnDetails.sexe;
    J'obtiens l'erreur E2010 Incompatible types: 'string' and 'SexeType'

    Je ne comprends pas comment changer le type provenant du WSDL en string par exemple ou float selon ce que je reçois.

    Merci

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    SexeType est une énumération donc un numérique
    C'est le WSDL qui doit contenir la liste des valeurs possibles, c'est donc mappé automatiquement même si une option doit exister pour modifier cela
    Alors que le nom est une valeur libre donc mappé en string simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lblSexe.Caption := GetEnumName(TypeInfo(SexeType), Integer(resultat[0].rnDetails.sexe));
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
      SEXES: array[SexeType] of string = ('Masculin', 'Féminin', 'Indéterminé');
    ...
     
    lblSexe.Caption := SEXES[resultat[0].rnDetails.sexe];
    Faire une encapsulation maison par dessus la classe généré automatiquement serait préférable, cela évite de manipuler un objet trop complexe (surtout si il change lors de la prochaine version de WSDL) et de rendre implicite de ce genre de conversion

    il faut voir le WS comme une couche Model qu'il faut séparer de la View via un Controller ... et à ce que je vois c'est parti en mode "à la one again"

    Si vous débutez en Delphi, il va falloir regarder de près le type énuméré, les constantes comme celle de TColor et la fonction IdentToColor c'est un code très insipirant
    Ensuite vous pourrez pousser vers la création de vos propres classes, pour éviter que votre code soit trop interdépendant.
    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

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Enumération
    Merci pour les détails complets et les liens. (Cadmap fonctionne sans soucis ;-) )

    Je continue mon développement.

    Lorsque j'importe mon WSDL, ils génèrent 2 fonctions :
    function lireEtudiant(const cfNum: cfNumType; const fromDate: TXSDate): response2; stdcall;
    function rechercherEtudiants(const niss: NISSType): response; stdcall;

    J'ai essayé plusieurs paramètres différents selon la documentation mais cela ne génère pas d'autres fonctions "identiques" (overload par exemple).
    http://docwiki.embarcadero.com/RADSt...rt_WSDL_Wizard

    Lorsque je suis dans SOAP UI, j'ai les 2 mêmes fonctions.
    Mais par exemple, la fonction lireEtudiant dans soap me permet d'avoir le paramètre FromDate optionnel.

    <v11:lireEtudiant>
    <v11:cfNum>xxxxxxxx-xx</v11:cfNum>
    <!--Optional:-->
    <!--<v11:fromDate>2020-01-01</v11:fromDate>-->
    </v11:lireEtudiant>

    Même problème avec la fonction rechercherEtudiants ou je devrais pouvoir rechercher un étudiant via son nom, son prenom et sa date de naissance.
    service : SEPSRechercheEtudiantsV1PortType;
    // récupérer le type dans le WSDL
    infos_niss : SEPSRechercheEtudiantsService_external_v1.NISSType;
    begin
    service := clHttpRio as SEPSRechercheEtudiantsV1PortType;

    infos_niss := edtniss.Text; // NISS
    resultat := service.rechercherEtudiants(infos_niss);


    Je dois certainement oublier quelque chose ou ne pas bien saisir l'utilisation du WSDL en Delphi.
    Je pense qu'il s'agit de l'importation dans Delphi qui ne génère pas tout ce que j'aurais besoin

    Je remets quelques liens qui m'ont aidé (si cela peut aider d'autres personnes)
    http://docwiki.embarcadero.com/RADSt...n/Web_Services
    https://www.clevercomponents.com/art...apsecurity.asp
    https://clevercomponents.com/product...rtificates.asp

    Je reviens vers vous dès que j'avance

    Encore merci

  14. #14
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut WSDL importer options
    Après plusieurs tests, je n'arrive pas à générer plusieurs fonctions identiques

    J'ai utilisé la ligne de commande également avec ou sans option

    "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\WSDLImp.exe" -P -SOAP11 -DC:\Downloads xxx\SEPSRechercheEtudiantsService_external_v1.wsdl

    J'ai essayé avec l'option -Ot+ mais cela ne semble rien modifier
    https://www.developpez.net/forums/d9...delphi-7-ocod/

    Ici les détails du webservice utilisé
    http://www.etnic.be/profils/benefici...34540eb51b65f0

    Voici le web service si cela peut aider
    http://www.etnic.be/profils/benefici...7f49f74dd84d0d

  15. #15
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    si mon souvenir est bon, WSDLImp ne génère pas d'overload, mais il ajoute un suffixe numéro pour les doublons.

    pour lireEtudiant, à vu de nez je dirais qu'il suffit de mettre "nil" dans le paramètre date...mais je peux me tromper

    quand à rechercherEtudiants, il faut voir dans la définition de NISSType qui doit permettre de renseigner plusieurs critères.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut WSDL overload
    Bonjour,

    Auriez-vous un autre WSDL qui génère deux fonctions identiques par hasard ?
    pour vérifier que l'erreur ne provient pas du WSDL importé.

    Merci pour vos réponses

  17. #17
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut XSD
    Bonjour tout le monde,

    J'avance, nous avons trouvé ceci
    (le fournisseur du WSDL va nous donner également des nouvelles informations prochainement)

    Dans le fichier XSD, l’élément edt :NISSType me génère la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function  rechercherEtudiants(const niss: NISSType): response2; stdcall;
    Voici le XSD

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xs:complexType name="RechercherEtudiantsRequeteType">
    <xs:sequence>
    <xs:choice>
    <xs:element name="niss" type="etd:NISSType"></xs:element>
    <xs:sequence>
    <xs:element minOccurs="0" name="forceRnFlag" type="xs:boolean"></xs:element>
    <xs:element name="nom" type="etd:NomType"></xs:element>
    <xs:element minOccurs="0" name="prenom" type="etd:PrenomType"></xs:element>
    <xs:element minOccurs="0" name="dateNaissance" type="etd:IncompleteDateType"></xs:element>
    <xs:element minOccurs="0" name="sexe" type="etd:SexeType"></xs:element>
    </xs:sequence>
    </xs:choice>
    </xs:sequence>
    </xs:complexType>

    Par exemple, si j’ajoute mixed= « true », j’obtiens un autre code lors que l’importation
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:complexType name="RechercherEtudiantsRequeteType" mixed="true">
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function  rechercherEtudiants(const parameters: rechercherEtudiants): rechercherEtudiantsReponse; stdcall;
    Je continue mes recherches mais si vous avez une autre idée, ce serait top.

    Merci

  18. #18
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Importation WSDL : types identiques
    Bonjour,

    Je reviens vers vous avec une nouvelle question :
    lorsque j'importe un WSDL, celui contient plusieurs types identiques.

    Type
    StatutFinFormationType = (C01, C02, C03, C04, C05, C06);
    ValorisationAcquisSanctionType = (C00, C01, C02, C03, C04);
    MotifExemptionType = (C01, C02, C03, C04, C05, C06, C07);
    MotifExemptionSpecType = (
    C01,
    C02,
    C03,
    C04,
    C05,
    C06,
    C07,
    C08,
    C09,
    C10,
    C11,
    C12,
    C13
    );

    Delphi me renvoit : 'Identifier redeclared: 'C01' 'C04' par exemple.
    Nom : delphi_error.png
Affichages : 1206
Taille : 48,9 Ko

    Auriez-vous une idée pour éviter ce problème et pouvoir utiliser tous les types ?

    Merci

  19. #19
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bug intéressant, s'il est possible d'interroger le WS publiquement, ou si tu peux joindre le WSDL ça serait sympa d'ouvrir un ticket sur Quality Central

    sinon tu peux forcer les préfixes d'ensemble avec {$SCOPEDENUMS ON}

    tu devras alors utiliser StatutFinFormationType.C01 ou MotifExemptionType .C01 car C01 ne sera plus reconnu tout seul
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Suite bugs et résolutions
    Bonjour tout le monde,

    Je continue dans mes résolutions et bugs

    1ère résolution, lors de l'importation d'un WSDL, voici les paramètres à cocher dans embarcedero 10.3

    Nom : Paramètres importateur Delphi SIMON.PNG
Affichages : 923
Taille : 375,0 Ko

    2ème résolution, lorsque le WSDL est généré, je modifie ceci
    published
    property niss: NISSType Index (IS_OPTN) read Fniss write Fniss;

    property niss: NISSType Index (IS_OPTN) read Fniss write Fniss stored false;

    Bugs :
    1er bug : je reste bloqué sur l'erreur
    raised exception class ERemotableException with message 'Policy Falsified'.

    J'ai ajouté des paramètres, supprimer des paramètres dans le wsdl, importer différement le wsdl mais rien ne fonctionne.
    Le fournisseur du WSDL ne connaît pas delphi...

    Je ne trouve aucun wsdl avec la même fonction et 2 paramètres identiques.
    Mon erreur doit venir de l'importation et de la génération

    Voici les fonctions dupliquées manuellement :

    function rechercherEtudiants(const niss: NISSType): response; stdcall;

    function rechercherEtudiants2(const nom: NomType; const prenom : PrenomType; const naissance: NaissanceType): response; stdcall;

    function rechercherEtudiants3(const forceRnFlag: Boolean; const nom: NomType; const prenom: PrenomType; const dateNaissance: IncompleteDateType): response; stdcall;


    2ème bug :

    Lors que je veux récupérer l'id de la requête, je ne reçois pas celui-ci de manière utilisable (sauf si je le découpe)

    J'arrive à récupéré ceci
    ns3:rechercherEtudiantsReponse-------------------------------------------------------------
    <requestId wsu:Id="id-2-441e2cd6a5d87a3eed3fb674c529b110" xmlns="http://etnic.be/types/technical/requestId/v1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">a74a145e-d784-4349-88ad-91d10553160d</requestId>
    -------------------------------------------------------------

    J'aurais besoin du numéro a74a145e-d784-4349-88ad-91d10553160d

    Au niveau du composant, TclHttpRio, je récupère via l'event clHttpRioAfterExecute les informations de la requête SOAP

    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
    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
    procedure TForm1.clHttpRioAfterExecute(const MethodName: string;
      SOAPResponse: TStream);
    var
      cpt_list: Integer;
      index: Integer;
      list: Tstringlist;
     
      responseList: IDOMNodeList;
      currentNode: IDOMNode;
      currentNode2: IDOMNode;
      cpt_response: Integer;
      cpt_child: Integer;
      cpt_child2: Integer;
     
      NodeSelect: IDOMNodeSelect;
     
      Response: string;
      requestId: String;
      requestId2: string;
     
      ProcessNodes: IXMLNodeList;
      NumberAttr: IXMLNode;
      i: Integer;
     
      // topnode, node, childnode, grandchildnode: TDOMNode;
     
    begin
      list := Tstringlist.Create;
      SOAPResponse.Position := 0;
      list.LoadFromStream(SOAPResponse);
     
      XMLDocument.LoadFromStream(SOAPResponse);
     
      NodeSelect := XMLDocument.DocumentElement.DOMNode as IDOMNodeSelect;
     
      currentNode2 := NodeSelect.selectNode('/Header/item[1]/requestId');
     
      try
        responseList := XMLDocument.DOMDocument.getElementsByTagName
          ('soap:Envelope');
        for cpt_response := 0 to responseList.length - 1 do
        begin
          requestId := '';
     
          for cpt_child := 0 to responseList[cpt_child].ChildNodes.length - 1 do
          begin
            currentNode := responseList[cpt_response].ChildNodes[cpt_child];
     
            if currentNode.firstChild.nodeName = 'requestId' then
            begin
              currentNode.firstChild.nodeValue;
              NodeSelect.selectNode('Envelope/Header/item[1]/requestId');
            end;
     
     
            if currentNode.nodeName.Equals('soap:Body') then
            begin
              mmo1.Lines.Text := mmo1.Lines.Text + currentNode.firstChild.nodeName;
     
     
              // requestId2 := currentNode.attributes.getNamedItem('requestId').nodeValue;
     
              // showMessage(currentNode.Attributes.getNamedItem('requestId').nodeValue);
            end;
           end;
        end;
        except
        on E: Exception do
          mmo1.Lines.Text := mmo1.Lines.Text + E.Message;
      end;
     
        list := Tstringlist.Create;
      SOAPResponse.Position := 0;
      list.LoadFromStream(SOAPResponse);
      // list.Text := StringReplace(list.Text,)
      // list.SaveToStream(SOAPResponse);
     
      for cpt_list := 0 to list.Count - 1 do
      begin
        // ShowMessage(list[cpt_list]);
        if list[cpt_list].Contains('requestid') then
        begin
          // ShowMessage('test');
        end;
      end;
     
      list.Find('requestId', index);
      // ShowMessage('index '+IntToStr(index));
     
      mmo1.Lines.Text := mmo1.Lines.Text +
        '-------------------------------------------------------------' + #10;
      mmo1.Lines.Text := mmo1.Lines.Text + list[index - 2] + #10;
      mmo1.Lines.Text := mmo1.Lines.Text +
        '-------------------------------------------------------------' + #10;
    D'avance, merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [X3-V11] WebService Connexion SOAP
    Par fred.pan dans le forum SAGE
    Réponses: 3
    Dernier message: 23/09/2019, 09h48
  2. Accès WebService via certificat SSL P12
    Par Tequilapaf dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 03/06/2015, 18h07
  3. Apache HTTPClient : Connexion SSL via certificat PKI
    Par mathias.deshayes dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 08/06/2011, 11h42
  4. connexion via asp ou php ?
    Par cege dans le forum 4D
    Réponses: 5
    Dernier message: 25/01/2006, 08h43
  5. [CR 9] [ASPX][C#]connexion via code
    Par nannous dans le forum Connectivité
    Réponses: 3
    Dernier message: 20/08/2003, 15h12

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