Récupérer des archives ZIP depuis une API

Bonjour,

Nous avons une API qui nous fournit des archives ZIP.

Comment récupérer ces archives ZIP sous Simplicité (Quelles classes utilisées ?..) ?

Bonjour!

Faut aller sonner chez la famille Tool.readUrl (javadoc), ça répond au besoin d’appel d’API dans 90% des cas, y compris pour les fichiers.

Si (après téléchargement) il y a besoin de manipuler les ZIP, voyez avec les ZIPTool (javadoc). NB: en général, le répertoire de travail de prédilection sur le filesystem est le répertoire temporaire, mais attention à laisser les lieux aussi propres que vous les avez trouvés pour éviter les problèmes de filesystem full :wink:

Cordialement,

2 Likes

Merci.
Est-ce qu’il existe une méthode Tool.readUrl qui prend en paramètre URL + token et qui retourne un tableau de byte ?
Je ne la voie pas dans la documentation.

En général, le token est transmis par le biais d’un Header HTTP, on utilise donc readURL byteArray avec header

var headers = new HashMap();
headers.put("Authorization", "Bearer "+token);
byte[] zip = Tool.readUrlAsByteArray(url, null, null, null, headers, Globals.BINARY);

Attention, le nom et la forme du header varient d’une API à l’autre.

1 Like

Quand j’ouvre le ZIP, j’ai ceci :

Est-ce que le problème vient de mon code ou de l’API ?

Mon code :

var headers = new HashMap();
headers.put("Authorization", "Token:"+token);
byte[] zip = Tool.readUrlAsByteArray(baseURL+"/service-document/v1/persons/"+person.getString("id")+"/export-zip", null, null, null, headers, null);
	
ObjectDB b4Instance = getGrant().getTmpObject("BfContact");
if(zip != null){
	synchronized(b4Instance){
		try{
			b4Instance.resetValues(true);
	        b4Instance.getField("bfCtZip").setDocument(b4Instance, "documents.zip", zip);
	        b4Instance.save();
		} catch(Exception e) {
			AppLog.error("", e, Grant.getSystemAdmin());
		}
	}
}

L’API :

En complément de la réponse de @Simon.

Pour un contenu ZIP, il faut impérativement lire l’URL en mode BINARY:

Tool.readUrlAsByteArray(baseURL+"/service-document/v1/persons/"+person.getString("id")+"/export-zip", null, null, null, headers, Globals.BINARY);`

Sinon c’est lu en mode texte (avec prise en compte de l’encoding par défaut UTF-8) ce qui altere potentiellement un contenu binaire comme un ZIP

Par ailleurs, êtes vous sûr que le passage de token est syntaxiquement correct ? En général le header Authorization est de type Bearer <token>, pas Token:<token>.

Dans le doute essayez d’ouvrir le fichier téléchargé avec un éditeur de texte pour voir ce qu’il contient réellement

1 Like

Effectivement, même après les corrections apportées par David, en ouvrant le ZIP avec un fichier texte :

<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.21.6</center>
</body>
</html>

Pourtant le Token est bon puisque je m’en sert dans une requête juste avant.

code :

var headers = new HashMap();
headers.put("Authorization", "Bearer:"+token);
byte[] zip = Tool.readUrlAsByteArray(baseURL+"/service-document/v1/persons/"+person.getString("id")+"/export-zip", null, null, null, headers, Globals.BINARY);
	
ObjectDB b4Instance = getGrant().getTmpObject("BfContact");
if(zip != null){
	synchronized(b4Instance){
		try{
			b4Instance.resetValues(true);
	        b4Instance.getField("bfCtZip").setDocument(b4Instance, "documents.zip", zip);
	        b4Instance.save();
		} catch(Exception e) {
			AppLog.error("", e, Grant.getSystemAdmin());
		}
	}
}

Une idée du problème ?

Que dit la documentation de votre API concernant le passage du token? Sous quelle forme vous en servez-vous dans la “requête juste avant” que vous mentionnez?

1 Like

Il ne faut pas de : entre Bearer et le token.

1 Like

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.