PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Utiliser le service Zoom de Géodis ou France Express
Utiliser le service Zoom de Géodis ou France Express
Débuté par jean.cougnaud, 12 déc. 2019 09:08 - 5 réponses
Posté le 12 décembre 2019 - 09:08
Bonjour,

Je bute sur l'utilisation d'un service web rest proposé par les transporteurs Géodis et France-Express. J'ai beau mettre les informations demandées j'obtiens toujours l'erreur 400 "Bad Request".
Il s'agit du service Zoom permettant de récupérer les informations sur les colis que nous envoyons.

Est-ce que quelqu'un a déjà utilisé ce service rest avec Windev ?

Jean
Membre enregistré
1 330 messages
Posté le 12 décembre 2019 - 10:12
Salut Jean,

Il est à la mode ce service Geodis :D

Je viens juste de répondre à Serge qui a également besoin de ce service

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/235364-webservice-fonction-suivi-zoom-geodis-235368/read.awp

Cordialement
Daryl

--
http://www.concept4u2.com
Posté le 12 décembre 2019 - 12:10
Bonjour Jean,
Tu utilises restenvoie ?

J'ai exactement le même problème j'obtiens toujours le code erreur 400.
J'ai essayé avec restenvoie et httprequest.

J'ai réussi a créer une page php grâce à l'exemple fourni.
J'ai donc pu vérifier que mon header était identique en php et sous windev.
Donc je pense pas que cela vienne de la construction de la requête.
Il doit y avoir des paramètres à ajouter soit dans les propriété de la variable restrequete.
Mais lesquels ???

Pour le moment je vais utiliser un httprequete sur une page que je vais développer en php pour récupérer les infos json.
L'inconvénient c'est qu'il faut déployer un serveur php pour heberger et executer cette page php.
Et que c'est pas très propre non plus.
Posté le 12 décembre 2019 - 14:08
Bonjour,

J'ai réussi à obtenir le résultat recherché. Je prépare un bout de code et je te l'envoie.

Jean
Posté le 12 décembre 2019 - 14:36
Voici un bout de code que j'ai fait pour mon test. En espérant qu'il te servira.

Jean

LOCAL
S_Chaine_A_Calculer est une chaîne
Buf_Parametres est un Buffer
Req_Demande est un restRequête
Req_Reponse est un restRéponse
Buf_Hash est un Buffer

Var_Reponse est un Variant

N_Epoch est un entier sur 8 octets
DH_Maintenant est une DateHeure

ST_Requete est une Structure
dateDepart est une chaîne
dateDepartDebut est une chaîne
dateDepartFin est une chaîne
noRecepisse est une chaîne
reference1 est une chaîne
cabColis est une chaîne
noSuivi est une chaîne
codeSa est une chaîne
codeClient est une chaîne
codeProduit est une chaîne
typePrestation est une chaîne
dateLivraison est une chaîne
refDest est une chaîne
nomDest est une chaîne
codePostalDest est une chaîne
natureMarchandise est une chaîne
FIN

GF_MaDemande est un ST_Requete


// on remplit les informations.

// ici je demande les mouvements entre le 01/01/2019 et le 31/12/2019
// j'y ai mis aussi le numéro du colis que je recherche dans SAI_S_No_Colis qui provient de ma fenêtre de test
GF_MaDemande:dateDepart=""
GF_MaDemande:dateDepartDebut="2019-01-01"
GF_MaDemande:dateDepartFin="2019-12-31"
GF_MaDemande:noRecepisse=""
GF_MaDemande:reference1=""
GF_MaDemande:cabColis=SAI_S_NoColis
GF_MaDemande:noSuivi=""
GF_MaDemande:codeSa=""
GF_MaDemande:codeClient=""
GF_MaDemande:codeProduit=""
GF_MaDemande:typePrestation=""
GF_MaDemande:dateLivraison=""
GF_MaDemande:refDest=""
GF_MaDemande:nomDest=""
GF_MaDemande:codePostalDest=""
GF_MaDemande:natureMarchandise=""

// On sérialise la demande en json
Sérialise(GF_MaDemande,Buf_Parametres,psdJSON)

// on prend l'heure actuelle
DH_Maintenant=DateSys()+HeureSys()

// on la transforme en epoch
N_Epoch=DateHeureVersEpoch(DH_Maintenant,epochUnixMilliseconde)

// on prépare la chaîne pour laquelle il faut calculer le hash qui sera mis dans l'entête
// SAI_S_Cle_API est la clé API demandée dans notre compte chez Géodis (champ de ma fenêtre de test)
// SAI_S_ID est notre identifiant chez Géodis (champ de ma fenêtre de test)

S_Chaine_A_Calculer=SAI_S_Cle_API+";"+SAI_S_ID+";"+NumériqueVersChaîne(N_Epoch)+";"+SAI_S_Langue+";"+SAI_S_Service+";"+Buf_Parametres
// on calcule le hash sha256
Buf_Hash=HashChaîne(HA_SHA_256,S_Chaine_A_Calculer)

// on prépare la requête
Req_Demande..Méthode=httpPost
Req_Demande..ContentType="application/json"
// SAI_S_ID est un champ dans lequel se trouve l'identifiant du compte Géodis
// SAI_S_Langue est un champ contenant la langue. Mettre : fr
Req_Demande..Entête["X-GEODIS-Service"]=SAI_S_ID+";"+NumériqueVersChaîne(N_Epoch)+";"+SAI_S_Langue+";"+BufferVersHexa(Buf_Hash,SansRegroupement)
// l'url est donnée dans la documentation Géodis (https://espace-client.geodis.com/services)
// elle provient d'un champ de ma fenêtre de test
// SAI_S_Service est un champ contenant le service donné dans la documentation Géodis (api/zoomclient/recherche-envois)
Req_Demande..URL=SAI_S_Url+"/"+SAI_S_Service

// affectation des champs de la demande dans Contenu
Req_Demande..Contenu=Buf_Parametres

// on execute la requête
Req_Reponse=HTTPEnvoie(Req_Demande)

SI ErreurDétectée ALORS
Erreur(ErreurInfo())
SINON
SI Req_Reponse.CodeEtat=200 ALORS // OK
// récupération du json renvoyé
Var_Reponse=JSONVersVariant(Req_Reponse.Contenu)
POUR TOUT Une_Livraison DE Var_Reponse.contenu
// on parcourt le tableau de résultat pour en faire ce qu' l'on veut
Info(ChaîneConstruit("Etat du suivi %1 = %2 au %3 ",Une_Livraison.noSuivi,Une_Livraison.codeSituation,Une_Livraison.dateEtat))
FIN

Info("Récupération OK")
SINON
// à compléter avec le libellé d'erreur retourné
Erreur("Erreur en appelant le service Géodis.")
FIN
FIN
Posté le 12 décembre 2019 - 15:30
Merci Jean. Il fallait juste que j'ajoute la requête dans contenu.
J'avais pourtant essayer mais lors de cet essai j'avais des problèmes sur ma requêtes.

Un GRAND merci à toi