import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; public class TestApiZoomClient { private static final Logger logger = LoggerFactory.getLogger(TestApiZoomClient.class); public static void main(String[] args) throws Exception { logger.info("Start of test"); testApiZoomClient(); logger.info("End of test"); } private static void testApiZoomClient() throws Exception { RestTemplate rest = new RestTemplate(); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String id = "ODYSSEE72"; // à remplacer par l'identifiant de l'accès Mon espace String cle = "9f40d4f1f31d44d78f2fc561cd3c2c39"; // à remplacer par l'api key générée pour utiliser la fonction zoom String url = "https://espace-client.geodis.com/services"; String serviceRechercheEnvois = "api/zoomclient/recherche-envois"; String serviceRechercheEnvoi = "api/zoomclient/recherche-envoi"; String lang = "fr"; FiltreRechercheEnvois filtreRechercheEnvois = new FiltreRechercheEnvois(); filtreRechercheEnvois.setDateDepartDebut("2020-01-08"); filtreRechercheEnvois.setDateDepartFin("2020-01-21"); String json = objectMapper.writeValueAsString(filtreRechercheEnvois); Reponse reponse = callService(rest, objectMapper, url, serviceRechercheEnvois, cle, id, lang, json); if(reponse.getCodeErreur() != null) { logger.info("Erreur : " + reponse.getCodeErreur() + " - " + reponse.getTexteErreur()); } else { Object contenuReponse = reponse.getContenu(); List listEnvoisSimples = objectMapper.convertValue(contenuReponse, new TypeReference>(){}); logger.info("Nb envois : " + listEnvoisSimples.size()); for(EnvoiSimple envoiSimple : listEnvoisSimples) { String log = "noRecepisse : " + envoiSimple.getNoRecepisse() + " - dateDepartFrs : " + envoiSimple.getDateDepartFrs() + " - libellePrestation : " + envoiSimple.getLibellePrestation() + " - reference1 : " + envoiSimple.getReference1() + " - nbColis : " + envoiSimple.getNbColis() + " - nbPalettes : " + envoiSimple.getNbPalettes() + " - poids : " + envoiSimple.getPoids() + " - nomExp : " + envoiSimple.getNomExp() + " - nomDest : " + envoiSimple.getNomDest() + " - libelleEtat : " + envoiSimple.getLibelleEtat() + " - dateEtatFrs : " + envoiSimple.getDateEtatFrs() + " - noSuivi : " + envoiSimple.getNoSuivi(); logger.info(log); } if(listEnvoisSimples.size() > 0) { int nbSuivisDetaillesMax = 20; int nbSuivisDetailles = 0; for(EnvoiSimple envoiSimple : listEnvoisSimples) { nbSuivisDetailles ++; if(nbSuivisDetailles > nbSuivisDetaillesMax) { break; } filtreRechercheEnvoi = new FiltreRechercheEnvoi(); filtreRechercheEnvoi.setNoSuivi(envoiSimple.getNoSuivi()); json = objectMapper.writeValueAsString(filtreRechercheEnvoi); reponse = callService(rest, objectMapper, url, serviceRechercheEnvoi, cle, id, lang, json); if(reponse.getCodeErreur() != null) { logger.info("Erreur : " + reponse.getCodeErreur() + " - " + reponse.getTexteErreur()); } else { contenuReponse = reponse.getContenu(); Envoi envoi = objectMapper.convertValue(contenuReponse, Envoi.class); String log = "Detail noRecepisse : " + envoi.getNoRecepisse() + " - instructionsLivraison1 : " + envoi.getInstructionsLivraison1() + " - instructionsLivraison2 : " + envoi.getInstructionsLivraison2() + " - natureMarchandises : " + envoi.getNatureMarchandises(); logger.info(log); if(envoi.getListSuivis() != null && envoi.getListSuivis().size() > 0) { for(Suivi suivi : envoi.getListSuivis()) { String log2 = " dateSuiviFrs : " + suivi.getDateSuiviFrs() + " - heureSuiviFrs : " + suivi.getHeureSuiviFrs() + " - libelleCentre : " + suivi.getLibelleCentre() + " - libelleCourtSuivi : " + suivi.getLibelleCourtSuivi(); if(suivi.getListInformationsComplementaires() != null && suivi.getListInformationsComplementaires().size() > 0) { for(String infoComplementaire : suivi.getListInformationsComplementaires()) { log2 = log2 + "\n " + infoComplementaire; } } logger.info(log2); } } } } } } } private static Reponse callService(RestTemplate rest, ObjectMapper objectMapper, String url, String service, String cle, String id, String lang, String json) throws JsonParseException, JsonMappingException, IOException, NoSuchAlgorithmException, DecoderException { logger.info("appel service : " + service + " - " + json); String ts = String.valueOf(System.currentTimeMillis()); String message = cle + ";" + id + ";" + ts + ";" + lang + ";" + service + ";" + json; String hash = computeHash(message); String serviceRequestHeader = id + ";" + ts + ";" + lang + ";" + hash; HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("Accept", "*/*"); headers.add("X-GEODIS-Service", serviceRequestHeader); HttpEntity requestEntity = new HttpEntity(json, headers); ResponseEntity responseEntity = rest.exchange(url + "/" + service, HttpMethod.POST, requestEntity, String.class); HttpStatus status = responseEntity.getStatusCode(); String body = responseEntity.getBody(); logger.info("status : " + status); logger.info("body : " + body); Reponse reponse = objectMapper.readValue(body, Reponse.class); logger.info("reponse.codeErreur : " + reponse.getCodeErreur()); logger.info("reponse.texteErreur : " + reponse.getTexteErreur()); logger.info("reponse.contenu : " + reponse.getContenu()); return reponse; } private static String computeHash(String message) throws NoSuchAlgorithmException, DecoderException, UnsupportedEncodingException { logger.info("message : " + message); MessageDigest md = MessageDigest.getInstance("SHA-256"); String hash = bytesToHexString(md.digest(stringToBytes(message))); logger.info("-> hash : " + hash); return hash; } public static String bytesToString(byte[] bytes) throws UnsupportedEncodingException { return new String(bytes, "UTF-8"); } public static byte[] stringToBytes(String str) throws UnsupportedEncodingException { return str.getBytes("UTF-8"); } public static String bytesToHexString(byte[] bytes) { return String.valueOf(Hex.encodeHex(bytes)); } public static byte[] hexStringToBytes(String str) throws DecoderException { return Hex.decodeHex(str); } }