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 service et SOAP


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut Web service et SOAP
    Bonjour

    J'essaye d'utiliser un Webservice en SOAP1.1 produit par un fournisseur (SONEPAR) pour établir des liaisons entre notre ERP maison et le leur
    Je suis sous Delphi 2007 + SQL server
    Donc j'ai importé le wsdl et j'essaie une de leur méthode ObtenirStockProduits 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
    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
     
    procedure TForm4.ObtenirStockProduitsBtClick(Sender: TObject);
    var
        sv : IWsService;
        R: THTTPRIO;
        p1 : DisponibilitesProduitsRequete;
        res : DisponibilitesProduitsResultat;
        aTabClient : ArrayOfClient;
        aTabProduit : ArrayOfProduit;
        s : string;
     
        h1 : UsernameToken;
        h2 : SiliciumHeader;
        h3 : AuthentificationRequete;
        hn : TSoapHeader;
    const
      defSvc  = 'WsService';
      defPrt  = 'BasicHttpBinding_IWsService';
     
    begin
        R:= THTTPRIO.Create(nil);
        p1 := DisponibilitesProduitsRequete.Create;
        h1 := UsernameToken.create;
        h2 := SiliciumHeader.create;
        h3 := AuthentificationRequete.create;
        hn := TSoapHeader.create;
     
        try
     
            SetLength(aTabClient, 1);
            p1.CollectionClients := aTabClient;
            p1.CollectionClients[0] := client.Create;
            p1.CollectionClients[0].CodeClient := 'XXXXXX';
            p1.CollectionClients[0].CodeEnseigne := 'XXXXXX';
     
            SetLength(aTabProduit, 1);
            p1.CollectionProduits := aTabProduit;
            p1.CollectionProduits[0] := Produit.Create;
            p1.CollectionProduits[0].CodeMarque := '00001';
            p1.CollectionProduits[0].CodeProduit := '032800';
     
            h1.UserName := 'XXXXXXXXXX';
            h1.Password := 'XXXXXXXXXX';
     
            h2.Username := 'XXXXXXXX';
            h2.CodePartenaire := 'XXXXXXXX';
     
            R.SOAPHeaders.Send(h1);
            R.SOAPHeaders.Send(h2);
     
            R.Service := defSvc;
            R.Port := defPrt;
            R.URL := 'https://silicium.sonepar.fr:444/services/silicium_v2';
     
            R.Converter.Options := OPToSoapDomConvert1.Options;
            R.OnBeforeExecute := HTTPRIO1BeforeExecute;
            R.OnAfterExecute := HTTPRIO1AfterExecute;
     
            res := (R as IWsService).ObtenirStockProduits(p1);
     
        finally
            p1.free;
            R.free;
            h1.free;
            h2.free;
            hn.free;
        end;
    end;
    sur cette invocation je capture le xml produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Header><UsernameToken xmlns="urn:wsse"><UserName>XXXXX</UserName><Password>XXXXX</Password></UsernameToken>
    <SiliciumHeader xmlns="http://tempuri.org/"><CodePartenaire xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</CodePartenaire><Username xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</Username></SiliciumHeader>
    </SOAP-ENV:Header><SOAP-ENV:Body><DisponibilitesProduitsRequete xmlns="http://tempuri.org/"><CollectionClients><Client><CodeClient xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</CodeClient><CodeEnseigne xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</CodeEnseigne>
    </Client></CollectionClients><CollectionProduits><Produit><CodeMarque xmlns="http://schemas.datacontract.org/2004/07/WcfContract">00001</CodeMarque><CodeProduit xmlns="http://schemas.datacontract.org/2004/07/WcfContract">032800</CodeProduit></Produit></CollectionProduits></DisponibilitesProduitsRequete></SOAP-ENV:Body></SOAP-ENV:Envelope>
    et j'obtiens en réponse celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="UTF-8"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header/>
    <s:Body>
    <s:Fault>
    <faultcode>s:R12</faultcode>
    <faultstring xml:lang="fr-FR">Une erreur s'est produite lors de l'invocation du service.</faultstring></s:Fault></s:Body></s:Envelope>
    mon fournisseur me donne un exemple de requete xml qui fonctionne depuis son EDI
    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
     
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:tem="http://tempuri.org/" xmlns:wcf="http://schemas.datacontract.org/2004/07/WcfContract">
    <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
    secext-1.0.xsd"> 
             <wsse:UsernameToken> 
                <wsse:Username>XXXXX</wsse:Username> 
                <wsse:Password>XXXXX</wsse:Password> 
             </wsse:UsernameToken> 
          </wsse:Security>
          <tem:SiliciumHeader>
             <wcf:CodePartenaire> XXXXX</wcf:CodePartenaire>
             <wcf:Username></wcf:Username>
          </tem:SiliciumHeader>
       </soapenv:Header>
       <soapenv:Body>
          <tem:DisponibilitesProduitsRequete>
             <!--Optional:-->
             <tem:CollectionClients>
                <!--Zero or more repetitions:-->
                <wcf:Client>
                   <!--Optional:-->
                   <wcf:CodeClient>XXXXX</wcf:CodeClient>
                   <!--Optional:-->
                   <wcf:CodeEnseigne>XXXXX</wcf:CodeEnseigne>
                   <!--Optional:-->
                   <wcf:CodeAgenceConnexion></wcf:CodeAgenceConnexion>
                </wcf:Client>
             </tem:CollectionClients>
             <!--Optional:-->
             <tem:CollectionProduits>
                <!--Zero or more repetitions:-->
                <wcf:Produit>
                   <wcf:CodeMarque>00001</wcf:CodeMarque>
                   <wcf:CodeProduit>032800</wcf:CodeProduit>
                   <!--Optional:-->
                   <wcf:CodeProduitSonepar></wcf:CodeProduitSonepar>
                </wcf:Produit>
             </tem:CollectionProduits>
          </tem:DisponibilitesProduitsRequete>
       </soapenv:Body>
    </soapenv:Envelope>
    En premier lieu je n'arrive pas à obtenir avec delphi cette écriture avec les préfixes définis au début et utilisés à la place des URI dans les objets ou classes
    ce n'est peut être pas utile mais cela rend le xml beaucoup plus lisible
    en deuxième lieu je n'arrive pas à faire générer l'item wsse:Security comme lui, je ne trouve pas de wsdl à importer pour l'item sécurité de Oasis
    cela m'enbête un peu de l'inclure à la volée dans le BeforeExecute car à terme j'ai plus de 40 méthodes à intégrer
    j'ai beau créer une classe UsernameToken dans une unité wsse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      UsernameToken = class(TSOAPHeader)
      private
        FUserName: WideString;
        FPassword: WideString;
      published
        property UserName: WideString  Index (IS_NLBL) read FUserName write FUserName;
        property Password: WideString  Index (IS_NLBL) read FPassword write FPassword;
      end;
    quels sont les éléments InvRegistry ou RemClassRegistry minimum à ajouter pour que cela se passe bien gràce à l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     R.SOAPHeaders.Send(h1);

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 : 14 086
    Par défaut
    OASIS, cela me rappelle de vieux souvenirs en D7 d'il y a 11ans
    Je n'avais pas réussi à l'époque à implémenter le WSE3

    On avait donc pour satisfaire à la paranoïa du tiers mis en WebService en HTTP (pas S) + Auth Basic le tout passant via un Tunnel SSH avec Port Forwarding

    Pour la sortie SOAP, il y a des options de l'importateur à cocher/décocher qui change la forme du XML
    La solution extrème est de chopper le Stream et le modifier à coup de StringReplace
    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 confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut
    Merci de ta réponse
    J'ai bien essayé toutes les options d'importation du WSDL sans que cela change grand chose au niveau de ces préfixes
    au fait le WSDL peut être trouvé ici
    https://silicium.sonepar.fr:444/serv...licium_v2?wsdl
    Je ne sais pas ou trouver une documentation qui explicite bien l'action de chaque option
    Pour ce qui est de changer à la volée en surchargeant le DoBeforeExecute (comme tu le préconisait dans un vieux post),si j'envoie le xml exemple qui m'est fournit j'obtiens l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ?xml version="1.0" encoding="UTF-8"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faultstring xml:lang="fr-FR">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></s:Fault></s:Body></s:Envelope>
    qui indique que le SOAPaction est vide
    Je ne sais pas ou renseigner ce SOAPAction
    J'ai essayé avec RAD studio Berlin 10.1 et cela ne semble pas mieux
    Je suis un peu désappointé
    Au fait il possible d'activer le déboggage dans les unités SOAP de delphi 2007 pour tracer le fonctionnement

    Bruno

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 : 14 086
    Par défaut
    Pour le débug
    Soit en activant les DCU de Débogage dans les options de projet (il faut CONSTUIRE le projet)
    Soit en ajoutant une copie du PAS dans ton projet (je l'ai fait justement pour modifier les unités standards et ajouter le XMLData de 2007 dans la version 7)
    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

Discussions similaires

  1. SAGE X3 V5 - Appel web service externe (SOAP)
    Par thorgal1612 dans le forum SAP
    Réponses: 0
    Dernier message: 02/09/2014, 15h01
  2. Web Services :Client SOAP pour un serveur REST
    Par victo dans le forum Services Web
    Réponses: 0
    Dernier message: 03/04/2014, 21h22
  3. Web Service Amazon SOAP
    Par sharkichoux dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 26/04/2011, 10h23
  4. Web Service Adressing SOAP Asynchone
    Par miryame dans le forum Services Web
    Réponses: 2
    Dernier message: 23/11/2006, 12h52

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