|
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
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
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)
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.
MerciMensaje 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élienMensaje 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 ...
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)
HRAZ(TABLE_LOGS) TABLE_LOGS.DATEHEURE = DateHeureSys() TABLE_LOGS.TYPE = "ERREUR" TABLE_LOGS.MESSAGE = sMessage ... HAjoute(TABLE_LOGS)
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é. |
| |
| |
| | | |
|
| | | | |
| | |
|