Appel API Apigee via le code Java

Tags: #<Tag:0x00007f2f2d950638>

Bonjour,

Je souhaiterai faire une action dans Simplicité qui ferait un appel API Apigee, voila mon code

String res = "";
		String apiURL;
		String apiParameters;
		
		apiURL = "https://apis-dev.renault.com/enterprise-repositories-purchasing/v2/data-quality";
		
		try {
			URL url = new URL(apiURL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoOutput(true);
			conn.setRequestMethod("GET");
			conn.setRequestProperty("Content-Type", "application/json");
			conn.setRequestProperty("Authorization", *AuthorizationToken*);
			conn.setRequestProperty("apikey", *apikey*);
	
			//Adding parameters to the URL connection
			input = "{ }";
			
			OutputStream os = conn.getOutputStream();
			os.write(input.getBytes());
			os.flush();
			AppLog.info(getClass(), "azeaze", com.simplicite.util.Tool.readUrl(apiURL), getGrant());	
			if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED && conn.getResponseCode() != 200) {
				throw new RuntimeException("Failed : HTTP error code : "
					+ conn.getResponseCode());
			}

(J’ai écris les propriété en brute juste pour les test, les variables entre * sont mes informations technique que je cache pour le post et j’ai rajouté un readURL pour tester mon URL)

Voila le résultat:


Je reçois une erreur HTTP 404 alors que mon readURL récupère bien au moins une information sur le lien que je leur ai donné

De l’autre côté, je fais le test sur Postman avec les mêmes informations

Et lui par contre est totalement fonctionnel

Sauriez-vous si il y a une erreur dans mon code ou bien manque-t-il des informations sur mon code comparer à Postman pour faire fonctionner mon appel API ?

[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-07-21 16:40 (revision 28d01f4adf37b49491b6e7991d397e64a1965f86)
DBPatchLevel=P24;829bd1c7636734c11b268226b94ddd20

Cordialement,
KWu

Déjà pour appeler des services REST, utilisez de préférence la classe helper RESTTool (cf. https://docs.simplicite.io/4.0/javadoc/com/simplicite/util/tools/RESTTool.html)

Ensuite ce qui est accessible de votre PC n’est peut être pas accessible du serveur de l’instance Simplicité, d’où peut être le 404

Bonjour @KWu, tu instancies un HttpURLConnection au lieu d’un HttpsURLConnection (+utiliser RESTTool comme recommandé par David).

Oui RESTTool masque ce genre de subtilités. Comme toujours ça reste une classe helper perfectible donc n’hésitez pas si ça ne correspond pas à votre cas particulier

Bonjour,

Je reviens vers pour le call API

Mon nouveau call avec l’utilisateur de RESTTool:

apiURL = "https://apis-dev.renault.com/enterprise-repositories-purchasing/v2/data-quality";
		
		try {
			res = RESTTool.get(apiURL, "Bearer *Bearer token*", null);
			AppLog.info(getClass(), "azeaze", res, getGrant());	

		} catch (HTTPException e) {
			e.printStackTrace();
			return e.getMessage();
	
		} 

Je reçois une nouvelle erreur, HTTP error 401 pour unauthorization

Sur Postman, ma requete marche toujours et là seule différence que je note est que je n’ai pas pas mis (ou n’a pas su où mettre) l’apikey

Ai-je fais une erreur dans mon utilisation de RESTTool, si oui auriez-vous un exemple de son utilisation pour que je puisse m’en inspirer ?
Ou bien manque-t-il une information que je n’ai pas ?

[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-07-21 16:40 (revision 28d01f4adf37b49491b6e7991d397e64a1965f86)
DBPatchLevel=P24;829bd1c7636734c11b268226b94ddd20

Cordialement,
KWu

La seule methode de RESTTool qui permet de passer des headers additionnels est la méthode generique request https://docs.simplicite.io/4.0/javadoc/com/simplicite/util/tools/RESTTool.html#request(java.lang.Object,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.util.Map,int)

On va regarder si on duplique de nouvelles variantes de get/post/put/del avec un argument en plus pour les headers.

PS :N’y a-t-il pas moyen de passer cette API key ailleurs que dans le headers HTTP (ex: en paramètre de l’URL genre ?apikey=xxxxx c’est très classique pour ce genre de choses, le header HTTP beaucoup moins)

Bonjour,

J’ai essayé de rajouté l’apikey dans l’URL, je reçois toujours l’erreur 401
Mais au final, meme résultat que sur Postman, j’ai retiré l’apikey du header,je l’ai mis dans l’url et j’ai eu comme résultat “Missing apikey”

Cordialement,
KWu

C’est pas magique, les headers HTTP et les paramètres URL ne sont pas interchangeables !

Regardez la documentation de votre service REST pour voir ce qu’il accepte comme mécanismes pour lui passer cette clé d’API.

Si c’est uniquement en header HTTP (ce qui n’est pas un mécanisme très usuel pour les services REST du marché) alors vous devrez utiliser la méthode générique que je vous ai indiquée qui permet de passer des headers HTTP additonnels.

Attention tout de même avec cette methode générique car toutes les combinaisions d’arguments ne sont pas possibles (ex: si vous mettez "GET" sur l’argulent method l’argument body ne doit pas être renseigné, etc.)

Comme je l’ai dit plus haut nous allons enrichir cette classe avec des variantes des méthodes get/post/put/del/... avec un argument headers en plus. En attendant cette évolution utilisez la méthode générique request

Effectivement la méthode générique a bien marché, je reçois bien la réponse que je souhaite via code

Dans le cas où d’autre personne aurait le même soucis, je pose mon code à titre d’exemple

        apiURL = "https://apis-dev.renault.com/enterprise-repositories-purchasing/v2/data-quality";
		Map<String, Object> mapHeader =  new HashMap<String, Object>() ;
		mapHeader.put("apikey", *apikey*);
		
		try {
			res = RESTTool.request("", "application/json", apiURL, "GET", "eyJra... *Bearer token*", null, mapHeader, 0);
			AppLog.info(getClass(), "APICall", res, getGrant());	

		} catch (HTTPException e) {
			e.printStackTrace();
			return e.getMessage();
	
		} 

On a enrichi la class RESTTool avec des méthodes get/post/put/... avec un argument supplémentaire, ex:

https://docs.simplicite.io/4.0/javadoc/com/simplicite/util/tools/RESTTool.html#post(java.lang.Object,java.lang.String,java.lang.String,java.lang.String,java.util.Map)
https://docs.simplicite.io/4.0/javadoc/com/simplicite/util/tools/RESTTool.html#get(java.lang.String,java.lang.String,java.lang.String,java.util.Map)
etc.

Utilisez celles là ce sera plus propre

1 Like