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

  1. #1
    Membre régulier
    Consommation Web service - problème d'authentifcation - Problème avec SOAPAjouteEntête ?
    Bonjour la Communauté.

    Je me tourne vers vous car après de mutliples tentatives, je n'arrive pas à consommer un web service.
    Pour donner le contexte, ce web service permet d'interroger une base de données de l'administration belge. La connexion est sécurisée.

    Il convient de préciser que j'ai testé ce web service via un outil tiers : SoapUI
    Pas de soucis avec cet outil : le retour se fait parfaitement.
    Voir print-screen



    Par ailleurs, je me suis assuré que j'appréhendais correctement la consommation d'un web service dans Windev en utilisant ce web service http://www.dneonline.com/calculator.asmx
    La consommation de ce web service ne pose aucun soucis.

    Voici mon code dans Windev

    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
     
    lSPFDemande est un checkEnterpriseNumbers
     
    WITH lSPFDemande
        .contactInformation.identifier.enterpriseNumber="blabla"
        .contactInformation.contactPerson.emailAddress="blabla"
        .contactInformation.contactPerson.firtname="blabla"
        .contactInformation.contactPerson.lastname="blabla"
        .contactInformation.contactPerson.phoneNumber="blabla"
        .contactInformation.mainEmailAddress="blabla"
        .contactInformation.mainPhoneNumber="blabla"
        .enterpriseNumber="blabla"
        .requesterEnterpriseNumber="blabla"
    END
    SOAPAjouteEntête(crassusService,"Username","blabla","http://minfin.fgov.be/dad/services/crassus")
    SOAPAjouteEntête(crassusService,"Password","blabla","http://minfin.fgov.be/dad/services/crassus")
    lbufByBuffer est un Buffer = SOAPPrépare(checkEnterpriseNumbers,lSPFDemande)
    SI PAS SOAPExécuteXML("https://ccff-test1.minfin.be/services/dadCrassusPublic",lbufByBuffer,"") ALORS ErreurInfo(errMessage)
    Trace(SOAPDonneRésultat(SOAPRésultatXML))


    Je mets en pièce jointe le xml du SOAPPrépare et du SOAPDonneRésulat :
    La balise <message>User or password invalid</message> ne laisse aucun doute sur le problème...

    Je joints également le wsdl du web service :

    J'avoue que je me sens à bout de ressources...

    D'avance merci pour vos précieux retours.

  2. #2
    Membre régulier
    Contournement avec les fonctions HTTP
    Je continue d'avancer sur mon problème...

    J'avais l'intuition que Windev ne construisait pas la requête HTTP correctement et n'allait pas placer le "Username" et le "Password" au bon endroit.
    Grâce à WireShark, j'ai analysé la structure envoyée par SoapUI.

    On voit clairement que les Username et Password ne se trouvent pas dans le contenu xml, mais bien plus haut.



    En fouillant l'aide de Windev, j'ai trouvé la propriété Entête des variables httpRequête.
    Je me suis dit : soyons fou, et codons tout de bout en bout.
    C'est donc un mix de soap et de http
    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
     
    lCrassus_SPF est une httpRequête
    lCrassusResponse est une httpRéponse
    lSPFDemande est un checkEnterpriseNumbers
    AVEC lSPFDemande
        .contactInformation.identifier.enterpriseNumber="blabla"
        .contactInformation.contactPerson.emailAddress="blabla"
        .contactInformation.contactPerson.firtname="Xavier"
        .contactInformation.contactPerson.lastname="NINANE"
        .contactInformation.contactPerson.phoneNumber="blabla"
        .contactInformation.mainEmailAddress="blabla"
        .contactInformation.mainPhoneNumber="blabla"
        .enterpriseNumber="blabla"
        .requesterEnterpriseNumber="blabla"
    FIN
    lbufByBuffer est un Buffer = SOAPPrépare(checkEnterpriseNumbers,lSPFDemande)
    lCrassus_SPF.ContentType=typeMimeTexteXML
    lCrassus_SPF.Entête["SOAPAction"] = ""
    lCrassus_SPF.Entête["Username"] = "MyUsername"
    lCrassus_SPF.Entête["Password"]="MyPassword"
    lCrassus_SPF.Contenu=lbufByBuffer
    lCrassus_SPF.URL="https://ccff-test1.minfin.be/services/dadCrassusPublic"
    lCrassusResponse = HTTPEnvoie(lCrassus_SPF)
    Trace(lCrassusResponse..Contenu)


    Et bingo, ça fonctionne.

    La question subsidiaire que je laisse à une âme charitable de la communauté : est-il possible d'arriver à ce résultat en restant dans les fonctions soap et sans devoir employer ce subterfuge ?

    Bonne fin de WE.

  3. #3
    Expert éminent
    Bonjour,

    Je me rappelle que l'on avait eu des soucis en WD18 parce que les fonctions SOAP n'allaient pas. On était repassés par des fonctions HTTP (et même par une astuce trouvée par un collègue : du VBS en OLE !).
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.