PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Utiliser constructeur de classe Web Service SOAP
Utiliser constructeur de classe Web Service SOAP
Iniciado por Aym, 23,mar. 2018 08:34 - 4 respuestas
Miembro registrado
80 mensajes
Popularité : +2 (2 votes)
Publicado el 23,marzo 2018 - 08:34
Bonjour,

Petite question, je n'arrive pas à initialiser des classes sur une application Windev Mobile en s'appuyant sur un Web Service SOAP Windev.

Exemple tout bête de la classe de connexion à un ERP :

PARTIE CLASSE WEB SERVICE
// Déclaration de WC_PMI_Connexion
WC_PMI_Connexion est une Classe
UTKTCODE est une chaîne
UTCTNOM est une chaîne
UTCTDIALO est une chaîne

bEtatWebService est un booléen
sErreur est une chaîne
FIN


// Constructeur (2/2)
Procedure Constructeur(sUTKTCODE est une chaîne)

:bEtatWebService = Vrai

SI PAS HOuvreConnexion(PMI) ALORS
:sErreur = "Erreur ! Impossible de se connecter à la base PMI."
SINON
sSQLConnexion est une chaîne = ChaîneConstruit([
SELECT UTKTCODE, UTCTNOM, UTCTDIALO
FROM UTILISAT
WHERE UTKTCODE = '%1'
],sUTKTCODE)

sdSQLConnexion est une Source dede Données
SI PAS HExécuteRequêteSQL(sdSQLConnexion,PMI,hRequêteSansCorrection,sSQLConnexion) ALORS
:sErreur = "Erreur ! " + HErreurInfo()
SINON
SI PAS HLitPremier(sdSQLConnexion,hSansRafraîchir) ALORS
:sErreur = "Erreur ! Utilisateur non trouvé."
SINON
:UTKTCODE = SansEspace(sdSQLConnexion.UTKTCODE)
:UTCTNOM = SansEspace(sdSQLConnexion.UTCTNOM)
:UTCTDIALO = SansEspace(sdSQLConnexion.UTCTDIALO)
FIN
FIN

HFermeConnexion(PMI)
FIN



INITIALISATION (PARTIE MOBILE)
// Clic sur BTN_MotDePasse
clConnexion est une WC_PMI_Connexion = allouer une WC_PMI_Connexion(sMotDePasse)


Cela renvoie l'erreur Aucune syntaxe de 'xsdEntité' ne correspond à l'appel.

J'ai essayé de contourner ça en initialisant la classe avec le constructeur vide puis en appelant une procédure publique de la classe avec le code du constructeur 2 mais même problème.

Merci
Mensaje modificado, 23,marzo 2018 - 08:38
Miembro registrado
38 mensajes
Popularité : +3 (3 votes)
Publicado el 23,marzo 2018 - 09:37
Bonjour,

j'imagine que tu as publié la classe WC_PMI_Connexion via le Webservice, or ça ne peux pas fonctionner comme ceci.

Tu dois publié une procédure "ConnexionBDD(sMotDePasse)" qui prend en paramètre le mot de passe et c'est elle qui va instancier la classe WC_PMI_Connexion.

CLASSE
WC_PMI_Connexion est une Classe
...
FIN

Procedure Constructeur(sUTKTCODE est une chaîne)

SI PAS HOuvreConnexion(PMI) ALORS
ExceptionDéclenche(500, "Impossible de se connecter à la base PMI.")
FIN
...
SI PAS HExécuteRequêteSQL(sdSQLConnexion,PMI,hRequêteSansCorrection,sSQLConnexion) ALORS
ExceptionDéclenche(500, HErreurInfo())
FIN
...
HFermeConnexion(PMI)

FIN


PROCEDURE PUBLIQUE PUBLIEE SUR LE WEBSERVICE
Procedure ConnexionBDD(sMotDePasse est une chaîne)

SI sMotDePasse = "" ALORS
ExceptionDéclenche(200, "Le paramètre sMotDePasse est obligatoire")
FIN

clConnexion est une WC_PMI_Connexion(sMotDePasse)

...


PARTIE MOBILE
NomDuWebService.ConnexionBDD(SAI_MotDePasse)

SI PAS ErreurDétectée() ALORS
...
SINON
...
FIN



Aurélien
Mensaje modificado, 23,marzo 2018 - 09:41
Miembro registrado
80 mensajes
Popularité : +2 (2 votes)
Publicado el 23,marzo 2018 - 14:48
Merci pour ta réponse Aurélien ! Ca fonctionne parfaitement comme ça !

J'ai essayé de contourner en déclarant une procédure publique globale dans la classe afin de mieux regrouper les informations mais ça ne fonctionne pas, il faut absolument que la procédure soit dans dans une collection pour qu'elle soit visible.

Petite question de bonne pratique qui n'a absolument rien à voir avec ça.

J'utilise comme tu l'as vu des variables pour remonter les erreurs rencontrés
- un booleen (bEtatWebService) qui est à Vrai si le Web Service a bien été appelé (permet de gérer les problèmes de WiFi, ...)
- une chaîne (sErreur) me renvoyant les erreurs rencontrées (mdp incorrecte, pb requête SQL, ...)

Et donc je vois que tu utilises la ExceptionDéclenche que je suis en train d'essayer.

Cette fonction pourrait-elle me permettre de remonter toutes ces infos ?

Il y a très peu d'information sur lle Web sur les bonnes pratiques de Windev !

EDIT : Le ErreurDétectée() passe bien à Vrai lorsque je déclenche une exception dans le Web Service, mais impossible de récupérer le code erreur et le message à part en faisant ErreurInfo() mais trop de blabla ...
Mensaje modificado, 23,marzo 2018 - 15:14
Miembro registrado
38 mensajes
Popularité : +3 (3 votes)
Publicado el 23,marzo 2018 - 16:59
Cela va dépendre du contexte de développement (Application, WebService, Site Web, etc.) mais la fonction ExceptionDéclenche() est particulièrement adaptée pour gérer les erreurs en mode WebService.

Souvent tu vas vouloir renvoyer plus qu'un simple VRAI ou FAUX en sortie de tes fonctions (paramètre manquants, problème de droits, enregistrement introuvable, etc.)

Ici tu peux définir un message et un niveau de "gravité", par exemple : "100" INFORMATION, "200" WARNING, "500" ERREUR, etc.

Il ne te reste plus qu'a faire une fonction pour traiter le message dans l'application mobile.

Personnellement je procède comme ceci sur l'application mobile :
Procedure rechecheClient(p_sIDCLient est une chaîne)

Client est un monWebService.cClient

Client = monWebService.rechercheClientParID(p_sIDCLient)

SI ErreurDetecteeSurAppelWS() ALORS
...
RETOUR
FIN

Info(Client.sNom)

FIN

Procedure GLOBALE ErreurDetecteeSurAppelWS() : booléen

SI ErreurDétectée = Vrai ALORS

// Récupère le détail depuis la fonction ErreurInfo() à coup de extraitchaine()
...

RENVOYER Vrai

SINON
RENVOYER Faux
FIN

FIN



Voir extrait de la doc :
Utilisée dans un Webservice, cette fonction permet : 
•d'arrêter le traitement en cours, 
•de renvoyer une erreur à l'application tierce utilisant le Webservice via le protocole standard SOAP.

Dans le code XML renvoyé par le Webservice, le message d'erreur est renvoyé dans la balise "faultstring". Le numéro d'erreur n'est pas renvoyé dans une balise spécifique, il est contenu dans le texte du détail complet de l'erreur contenu dans la balise "detail". 
Attention : Lors de la consommation de ce Webservice dans une application WINDEV, WEBDEV ou WINDEV Mobile, la récupération de l'erreur doit se faire avec la fonction ErreurInfo et non pas avec la fonction ExceptionInfo.


Et après rien ne t’empêche de surcharger la fonction ExceptionDéclenche(), coté WebService, pour tracer les erreurs en base.

Procedure ExceptionDéclenche(nNumeroErreur est un entier, sMessage est une chaîne)

// Sauvegarde l’événement en base
HRAZ(TABLE_LOGS)
TABLE_LOGS.DATEHEURE = DateHeureSys()
TABLE_LOGS.TYPE = "ERREUR"
TABLE_LOGS.MESSAGE = sMessage
...
HAjoute(TABLE_LOGS)

// Déclenche l'exception
WL.ExceptionDéclenche(nNumeroErreur, sMessage)

FIN
Mensaje modificado, 23,marzo 2018 - 17:05
Miembro registrado
80 mensajes
Popularité : +2 (2 votes)
Publicado el 26,marzo 2018 - 09:42
Superbe !

Merci pour toutes ces informations.

Cela me permettra d'avoir des logs plus poussés sur mes web services et de mieux gérer les erreurs.

Par contre, étrangement, ErreurDétectée ne passe pas à Vrai sur Windev Mobile lorsque mon WS renvoie une exception. Mais ErreurInfo lui, est bien initialisé.