PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Web services et Soap
Web services et Soap
Débuté par LC, 06 mai 2021 11:40 - 27 réponses
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 06 mai 2021 - 11:40
Bonjour à tous,
on me demande d'envoyer par SOAP via un web service un message XML.
Dans un premier temps, j'ai crée le fichier XML qui est ok, cela pour vérifier déjà le bon format du fichier et des données à l'intérieur. Ensuite on m'a donné ces paramètres (ci dessous) pour l'envoi, mais j'avoues ne pas maitriser le SOAP et Webservices. ils me disent qu'il ne faut pas envoyer le fichier XML en lui même mais dans le message avec l'url
voici ce que l'on m'a donné :

Voici les accès :
L’URL à attaquer est : https://SRVxxx-//societe/Codeunit/WS_IN_Vente
User ID : xxx
Mot de passe : xxxx
Egalement joins un fichier WSDL
Le web service est : S012_Creation_Commande

Comment faut il faire avec tout ces paramètres ?
il faut utiliser SOAPExecute ? SOAPExecuteXML ?
ou dois je paramétrer tout ce que l'on m'envoie ?
Merci d'avance pour votre aide
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 06 mai 2021 - 16:23
pour compléter ma demande, du coup j'ai "importer un web service" et j'ai du coup dans le projet la description ,
mais je ne sais comment envoyer le tout, par quel process ? quelqu'un peux m'aider ?
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 06 mai 2021 - 21:42
personne ?
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 07 mai 2021 - 17:13
J'ai avancé un peu,
avec les paramètres donnés, j'ai "importé" le web service avec l'url ou bien le fichier wsdl, à priori c'est bon.
ce WS est assez complexe, j'avais écrit l'équivalent dans une chaine, ici : DocXML
Ensuite que dois je lancer ?
ci joint une image avec un SoapExecute (image jointe surligné en jaune)
après cette instruction, je n'ai pas de message d'erreur mais il ne se passe rien ... je ne sais, si je procède de la bonne manière.
quelqu'un peux m'aider ?


Membre enregistré
3 913 messages
Popularité : +227 (347 votes)
Posté le 08 mai 2021 - 13:33
Bonjour,
Il faut considérer le WS comme une collection de procédure.
Tout est expliqué dans la doc

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 10 mai 2021 - 08:35
bonjour,
merci pour ta réponse
mais je ne vois pas comment je dois l'appeler ? avec executesoap ? executesoapxml ou autrement ?
Membre enregistré
3 913 messages
Popularité : +227 (347 votes)
Posté le 10 mai 2021 - 09:49
De la même manière qu'une procédure.
Une fois de plus, tout est expliqué dans la doc

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 10 mai 2021 - 11:12
j'ai bien sur regarder la doc, je ne maitrise pas trop les WS, je ne comprends pas la différence entre executesoap et executesoapxml,
tu peux m'éclairer s'il te plait ?
Membre enregistré
403 messages
Popularité : +13 (13 votes)
Posté le 10 mai 2021 - 16:28
Bonjour,

Les fonctions executesoap() et executesoapxml() sont des fonctions "bas-niveau", que l'on vous déconseille d'utiliser surtout si vous êtes novices avec les webservices.

Comme l'a indiqué Voroltinquo, si vous avez importé le webservice dans votre projet il se comporte maintenant comme une collection de procédure. Cela veut donc dire que vous pouvez écrire un code dans ce genre:

maCommande est un S012_Creation_Commande
monResultat est un S012_Creation_Commande_Result

// Ici attribuer les valeurs que vous voulez sur maCommande pour les envoyer au webservice
// Cela dépend de la description de la structure de S012_Creation_Commande
// L'auto-complétion affichera les membres disponibles
maCommande.Numéro = 183432089
maCommande.Client = "Jean Dupont"
// etc.

monResultat = WS_IN_Vente.S012_Creation_Commande(maCommande)

// Traiter le retour de monResultat
// ici aussi l'auto-complétion affichera les membres disponibles
SI monResultat.success = Vrai ALORS
Info("Commande créée!")
FIN
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 10 mai 2021 - 17:05
Merci beaucoup pour ta réponse,
j'ai donc codé ça en mettant une trace avant et après cette ligne :
monResultat = WS_IN_Vente.S012_Creation_Commande(maCommande)
avec la complétion du retour j'ai donc "tracé" la variable de retour, héla chaine vide en résultat
je n'ai aucun message d'erreur, rien ne plante mais j'ai une chaine vide en retour.
est ce que je demande au fournisseur du WS le pourquoi ? ou est ce moi ?
Sachant que lorsqu'il ma donné tous les éléments pour importer le WS, il m'a donné un code utilisateur et un mot de passe pour accéder au WS.
le fait d'importer le WS suffit ?
Membre enregistré
403 messages
Popularité : +13 (13 votes)
Posté le 10 mai 2021 - 18:08
Si vous tentez de tracer directement la variable (avec un Trace(monResultat) ) et que la variable est une structure, il y a peu de chance que la trace affiche quelque chose de correct. Si "S012_Creation_Commande_Result" est une structure (comme ça l'est souvent avec SOAP) il est possible d'avoir une trace un peu plus parlante en la transformant en JSON : Trace(VariantVersJSON(monResultat)).

Sinon l'idéal est encore de mettre un point d'arrêt (ou l'instruction équivalente : STOP) pour arrêter l'exécution et voir directement dans l'IDE ce que contient monResultat.

Enfin il peut être bon de vérifier qu'il n'y a pas eu d'erreur de plus bas niveau, typiquement la trame HTTP ou autre avec un code générique du genre

// Reprise du code précédent
monResultat = WS_IN_Vente.S012_Creation_Commande(maCommande)

// Vérification d'erreur
SI ErreurDétectée ALORS
Trace("Erreur Détectée", ErreurInfo(errComplet))
FIN
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 10 mai 2021 - 18:18
merci je vais tester ça...
Cependant je me pose toujours la question par rapport au code que tu m'as donné, ou dois-je rentrer l'url le code utilisateur et mot de passe ?
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 10 mai 2021 - 18:29
J'ai un message d'erreur de certificat, alors que le fournisseur me garanti qu'il est bien installé, voici la trace dans un fichier log (erreurdetectee):
code:-----------------------------
TexteXML est une S012_Creation_Commande
ReponseXML est une S012_Creation_Commande_Result
//TextXML étant bien rempli ...
fEcritLigne(FichierLog,"[" + DateVersChaîne(DateSys()) + " " + HeureVersChaîne(HeureSys()) + "] " + "Avant envoi ")
ReponseXML = WS_IN_Vente.S012_Creation_Commande(TexteXML)
SI ErreurDétectée ALORS
fEcritLigne(FichierLog,"[" + DateVersChaîne(DateSys()) + " " + HeureVersChaîne(HeureSys()) + "] " + "Erreur : " + ErreurInfo(errComplet))
SINON
fEcritLigne(FichierLog,"[" + DateVersChaîne(DateSys()) + " " + HeureVersChaîne(HeureSys()) + "] " + "Retour1: " + ReponseXML.wSReturnError.Header.Success)
fEcritLigne(FichierLog,"[" + DateVersChaîne(DateSys()) + " " + HeureVersChaîne(HeureSys()) + "] " + "Retour2: " + VariantVersJSON(ReponseXML.wSReturnError.Header.Success))
FIN


trace:------------------------------
10/05/2021 18:23:32:51] Erreur : Appel WL :
Traitement de 'Procédure globale ExportBC' (COL_ProcéduresGlobales.ExportBC), ligne 345

Que s'est-il passé ?
Alerte de sécurité : le nom sur le certificat de sécurité est incorrect ou ne correspond pas au site demandé.

Code erreur : 100139
Niveau : erreur non fatale

Code d'erreur système : 12038

Module : 'wd260com64.dll (01F260089p - 26.0.264.0)
Informations supplémentaires :
EIT_PILEWL :
Procédure globale ExportBC (COL_ProcéduresGlobales.ExportBC), ligne 345
Initialisation de SynchroPrimusVersTablettes (), ligne 52
EIT_DATEHEURE : 10/05/2021 18:23:32
EIT_TYPE_WDFILE : <7>
EIT_IDCODE : <458752>
Membre enregistré
480 messages
Popularité : +20 (20 votes)
Posté le 10 mai 2021 - 22:20
LC a écrit :
merci je vais tester ça...
Cependant je me pose toujours la question par rapport au code que tu m'as donné, ou dois-je rentrer l'url le code utilisateur et mot de passe ?

La doc, toujours la doc ...






Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 10 mai 2021 - 23:10
Effectivement la doc et toujours la doc .. j'ai effectivement trouvé tout ce qui est identification.
Merci encore à tous de m'avoir aidé.
j'ai encore un petit problème :
mon web service possède des méthodes je dirais (entête de commande) et des lignes détail (lignes de commandes)
dans l'image jointe il faut donc que je créé plusieurs fois la méthode "line"
j'ai bien affecté les valeurs "header", j'ai fais une boucle pour lire toutes les lignes détail mais en affectant
les balises "lines" et ses enfants, et bien c'est la dernière ligne qui est renseignée, comment écrire l'affectation des balises dans une boucle ?


Membre enregistré
3 913 messages
Popularité : +227 (347 votes)
Posté le 11 mai 2021 - 05:51
BOUCLER tant qu'il reste des donner à lire
-lire les données nécessaires à la ligne
-créer la ligne


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 08:42
Merci, oui une boucle ça c'est bon je sais faire, mais comment j'affecte les variables de mon WS
si j'exécute le code ci dessous, seule la dernière ligne de ma requête est prise en compte dans mon WS
ce qui me parait normal vu l'affectation, comment dois je remplir mon WS en "ajout" pour avoir plusieurs "line"
POUR TOUT MaRequete
WS.Heaser.line.Line_LinesNo = MaVariable
FIN
Membre enregistré
403 messages
Popularité : +13 (13 votes)
Posté le 11 mai 2021 - 09:11
Bonjour,

"Normalement", Line devrait être un tableau auquel vous ajoutez des données avec un Ajoute()

POUR TOUT MaRequete
tmpLine est une Line
tmpLine.Line_No = 1
tmpLine.Line_Qty = MaRequete.Quantite
Ajoute(maCommande.Line, tmpLine)
FIN


Cependant ici il y a l'air d'avoir un souci, le membre "Line" n'a pas l'air d'être un tableau chez vous (il me semble que l'icône devrait être différente), et le nom de la variable est au singulier plutôt qu'être au pluriel "Lines", ce qu'on voit généralement quand on décrit un tableau. Il faudrait peut-être se rapprocher du fournisseur du webservice pour qu'il vérifie avec vous.
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 10:17
Merci beaucoup encore pour votre aide, j'ai donc demandé au fournisseur du WS et il m'a répondu :
"Line est une variable « unbounded » c’est à dire que vous pouvez la répéter autant de fois que vous voulez.
Il suffit de répéter le bloc Line pour créer plusieurs lignes"

je vais donc faire comme vous me l'avez indiqué, je pense que ça ira.
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 10:34
Heu... encore besoin d'aide, je déclare comment la ligne de ton code : tmpLine est une Line
line est inconnue...
et je ne peux pas écrire ça :
tmpline est une S012_Creation_Commande.wSCommandeIN.Header.Line
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 12:11
Sur les 2 images jointes, la structure du Webservice
je ne sais pas comment déclarer un tableau de "line"
c'est un bon de commande, je dois faire plusieurs lignes de la balise "line"






Membre enregistré
3 913 messages
Popularité : +227 (347 votes)
Posté le 11 mai 2021 - 12:56
Bonjour,
Line est un membre de Header, lui même un membre de wSCommandeIN.
ce n'est pas Line qu'il faut déclarer mais la commande
MaCommande est wSwSCommandeIN

POUR TOUT...
MaCommande.Header.Line.Line_LineNo++
...
FIN


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 13:38
Bonjour,
oui mais j'ai aussi une entête que je dois remplir "qu'une" seule fois, je procède ainsi :
TexteXML est une S012_Creation_Commande
ReponseXML est une S012_Creation_Commande_Result
TexteXML.wSCommandeIN.Header.Header_TypeOrdre = "X'
TexteXML.wSCommandeIN.Header.Header_DocType = "Y"
TexteXML.wSCommandeIN.Header.Line.Line_LineNo = "Z"
TexteXML.wSCommandeIN.Header.Line.Line_Type = "A"
ReponseXML = WS_IN_Vente.S012_Creation_Commande(TexteXML)
les 2 lignes concernant le "line" ne conviennent pas du coup
donc comment j'adapte le code que tu m'a donné ?
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 15:09
cette déclaration : MaCommande est wSCommandeIN ne passe pas à la compilation : wSCommandeIN inconnu
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 11 mai 2021 - 18:06
wSCommandeIN est aussi un membre, je ne vois pas comment je dois déclarer ma commande ..
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 12 mai 2021 - 11:11
quelqu'un pourrait m'aider ?
Membre enregistré
637 messages
Popularité : +0 (16 votes)
Posté le 12 mai 2021 - 17:21
Bonjour à tous,
bon, j'ai trouvé, malgré les apparence "line" ne doit pas être déclaré comme un tableau mais peut être indicé line[x]
bon ... faut deviner
si ça peux servir à d'autres personnes...
Membre enregistré
3 messages
Posté le 22 octobre 2021 - 13:47
Bonjour




je suis débutant en développement. J'ai créé un web service soap afin de consommer une application. Dans mon webservice j'ai créé deux procédures login et inscription .
lors de la génération ; à la troisième étape il ne trouve pas les fichiers accessibles .
voici mes programmes de test login et inscription . Vous trouveriez la capture image en pièce jointe
SVP AIDER MOI

Cordialement
GFT
-----------------------------------------------------------------------------------------------

PROCÉDURE login(snomutilisateur est une chaîne, sMotDePasse est une chaîne )

SI HLitRecherchePremier(Utilisateur,IDUtilisation,sNomUtilisateur) ALORS

SI Utilisateur.MotDePasse=sMotDePasse ALORS
RENVOYER Vrai
SINON
RENVOYER Faux

FIN
SINON
RENVOYER Faux

FIN

-------------------------------------------------------------------------------------------------------

PROCÉDURE Inscription(snomutilisateur est une chaîne, sMotDePasse est une chaîne , sAdresseEmail est une chaîne , stelephone est une chaîne )

Utilisateur.Nomutilisation=snomutilisateur
Utilisateur.MotDePasse=sMotDePasse
Utilisateur.AdresseEmail=sAdresseEmail
Utilisateur.Telephone=stelephone
SI HAjoute(Utilisateur) ALORS
RENVOYER Vrai

SINON
RENVOYER Faux

>FIN