Bonjour,
voici mon problème pour lequel j'ai besoin d'aide. Donc merci par avance à ceux qui pourront m'aider. Et désolé, je me rends compte que mon message est assez long à lire...
Contexte :
pour récupérer des données d'un service fournisseur interne à mon entreprise, je dois utiliser des web services et retravailler les données qu'ils me renvoient (formatage, agglomération, .. avec aussi d'autres données de fichiers excel), par le biais d'une macro Excel VBA.
J'utilise pour cela l'utilitaire wget.exe, avec les paramétrages d'appel aux webs services, et récupère un fichier de données au format .xml, via vba, que j'importe ensuite dans excel.
Cela fonctionne bien dans la macro, du moins lorsque le web service répond convenablement.
Problème :
Le problème c'est que ces webs services peuvent ne pas répondre, ou pas tout de suite (code http 500 notamment, assez fréquent, qui impose d'attendre une trentaine de secondes avant de réexécuter l'appel). Et dans ce cas ça plante (car le fichier de données ne contient pas de données mais un message d'erreur, qui n'est pas reconnu au moment de l'import excel).
Objectif :
Je veux donc pouvoir tester le code retour du web service juste après l'appel, afin d'orienter mon traitement vers un import excel, une gestion d'erreur ou un délai d'attente, du genre :
- appel web service
- si code retour = 200 => traitement normal
- si code retour = 500 => attente, et relance au bout de 30 sec
- si code retour autre => arrêt du traitement et gestion d'erreur et message d'erreur.
Mais je n'arrive pas à le faire, et je n'ai pas trouvé de réponse malgré toutes mes recherches (nombreuses) dans les forums/FAQ et dans l'aide de wget ou de vba.
Je dois être idiot …
J'ai essayé d'intercepter le code http, avec l'instruction "%{http_code}" , mais ça ne fait que l'afficher sans l'écrire dans un fichier en sortie.
J'ai essayé de récupérer la sortie stdout dans un fichier de données (.xml), et la sortie stderr dans un fichier de log (.txt), ce qui fonctionne, mais ce dernier ne contient que l'affichage qui apparaît à l'écran quand on lance manuellement via invite de commande windows, et pas le code retour.
J'ai testé le Err.Number, mais il ne contient pas le code http du web service appelé.
Quand le WS renvoie un code 500, j'ai dans le fichier de données (.xml) le message {"responseCode":500,"message":"Read timed out","trace":null}, qui fait planter l'instruction d'import. Il me faut donc pouvoir analyser ce code retour http avant l'import !
Mon code VBA en cours de réalisation (extrait):
Remarques complémentaires :
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
69
70
71
72
73 .... 'Initialisation des variables spécifiques à l'appel du Web Service (paramètres): Nom_Chemin_exe = "C:\Users\xxxxxxx\" Nom_exe = "wget.exe" Nom_Option_1 = " --no-check-certificate " If W_ENV = "PROD" Then W_ENV indique lenvironnement sur lequel ça tourne,PROD, RECETTE, etc paramètre) Nom_Connexion_WS_Gaia = "--header=""X-API-Key:xxxxxxxxx"" --http-user=""xxxxx xxx"" --http-password=""xxxxxxx"" " Nom_Chemin_WS_Gaia = "https://portail3xxxxxxx/" Else Nom_Connexion_WS_Gaia = "--header=""X-API-Key:yyyyyyyyyyyyyy"" --http-user=""yyyyyyyy"" --http-password=""yyyyyyy"" " Nom_Chemin_WS_Gaia = "https://portail3.yyyyyyyyyyyyyyyy/" End If 'Le Web Service appelé : Nom_WS_Gaia = "specialites/xml" ' 'Paramètre du fichier d'extraction en sortie (données .xml) : Nom_Option_2 = " -P /gaia/file -O " Nom_Chemin_Fic_sortie = "C:\Users\xxxxxxx\" 'Nom_Chemin_exe If W_ENV = "PROD" Then Nom_Fic_sortie = "Fic_xxxxx_specialites" & "_" & Dat_heure & ".xml" Else Nom_Fic_sortie = "Fic_xxxxx_specialites" & "_" & Dat_heure & "_" & W_ENV & ".xml" End If Nom_Option_3 = " -x" FILENAME = Nom_Chemin_Fic_sortie & Nom_Fic_sortie 'Tous ces paramètres agglomérés dans la variable Command command = Nom_Chemin_exe & Nom_exe & Nom_Option_1 & Nom_Connexion_WS_Gaia & Nom_Chemin_WS_Gaia & Nom_WS_Gaia & Nom_Option_2 & FILENAME & Nom_Option_3 'Appel du WS (instruction "Shell") Shell command, vbNormalFocus 'TEST QUI NE FONCTIONNE PAS Gestion des codes erreur possibles : 500 <=> Indisponibilité temporaire du WS. ==> Attendre 30' et retenter ! If Err.Number = 500 Then Nb_tentatives = 1 While Err.Number <> 0 And Nb_tentatives <= 10 Application.Wait (Now + TimeValue("0:00:30")) Shell command, vbNormalFocus Nb_tentatives = Nb_tentatives + 1 Wend End If 'Si au bout de 10 tentatives successives on a toujours une erreur, décrochage en Fin de Traitement en Anomalie. If Err.Number <> 0 Then GoTo errorHandler End If '3) Import des données extraites dans l'onglet Excel "Données .xml" 'Import fichier .xml dans un onglet Excel Dim XM As XmlMap XLS_NewBook.XmlImport _ url:=FILENAME, _ ImportMap:=Nothing, _ Overwrite:=True, _ Destination:=Worksheets("Données .xml").Range("$a$1") 'Définit le mappage qui vient d'être ajouté. Set XM = XLS_NewBook.XmlMaps(ThisWorkbook.XmlMaps.Count) MsgBox "Import terminé" & vbCrLf & _ XM.RootElementName & vbCrLf & _ XM.Name & vbCrLf & _ XM.DataBinding.SourceUrl ...
- le choix technique est imposé : Web Service, et macro vba dans excel pour simplicité de traitement des fichiers et données diverses
- je ne peux pas installer de logiciel sur le PC pro
- j'ai été développeur il y a bien longtemps, mais quasi exclusivement en grand système (cobol). Je me débrouille en vba (sans être un pro), et je n'ai pas ou pas beaucoup de capacité dans d'autres langages
- le traitement doit être le plus simple possible, pour son écriture et sa maintenance future.
Partager