POST en REST json

Bonjour,

je veux faire un post en REST JSON en envoyant 4 paramètres : 3 strings et un objet json.

Est-ce-que vous avez un exemple de syntaxe ?

Pour appeler des services externes, il faut utiliser les fonctions `java Tool.readUrl

vous pouvez regarder des exemples d’appel à des service tiers dans
https://www.simplicite.io/resources/documentation/01-core/third-party-apis-examples.md
ou rechercher “readUrl” dans la documentation

Les paramètres sont à envoyer dans les postData, votre objet json doit être sérialisé en String s’il ne l’est pas déjà via JSON.stingify

	/**
	 * Read from URL with basic HTTP authentication and POST data
	 * @param url URL to read (POST if postData is set or GET)
	 * @param username Optional user name
	 * @param password Optional password
	 * @param postData Optional POST data (URL-encoded String or Map)
	 * @param headers Optional extra headers (String array of "name:value" or Map)
	 * @return Full response as text, or exception SocketTimeoutException, IOException, InterruptedException
	 */
	public static String readUrl(String url, String username, String password, 
             Object postData, Object headers) throws Exception

      // ou pour préciser la methode et l'encoding
	public static String readUrl(String url, String username, String password, 
             String method, Object postData, Object headers, String encoding) throws Exception

Exemple

var data = new java.util.HashMap();
data.put("var1", "value1");
data.put("var2", "value2");
data.put("var3", '{ "a":1, "b":"text" }');
var rep = Tool.readUrl("url...", "user", "pwd", "POST", data, null, "UTF-8");

le data généré est : {in_typeMedia=SMS, mem_destinataires=[{“destinataire”:“0672760794”,“statut”:“”,“liste_noire”:“”}], in_competence=DEFAULT, in_message=test envoi par ws}

quand je l’éxécute via postman, j’ai un retour ok
par contre, en utilisant le Tool.readUrl j’ai un retour ko

à priori, le bus n’arrive pas à lire le JSON imbriqué des destinataires.

Il faut déjà savoir si votre webservice POST marche avec un body contenant de simples paramètres URL-encodés ou un object JSON.

Dans le doc https://www.simplicite.io/resources/documentation/01-core/third-party-apis-examples.md, il y a plusieurs exemples que vous pourrez forcément transposer une fois que vous aurez clarifié la manière dont votre webservice doit être appelé.

L’exemple de @Francois produira un POST de paramètres URL-encodés, s’il s’agit plutôt de poster un objet JSON, l’exemple du service “sendWithUs” sera un bon exemple.

Ceci dit, Tool.readUrl n’est qu’un wrapper simplifié des libs Java natives d’appels HTTP (java.net.HttpURLConnection et consors). Donc si cette couche ne répond pas à votre besoin, vous pouvez utiliser ces libs directement ou, mieux encore, les libs commons HTTP Apache qui sont aussi intégrées à Simplicité.Vous trouverez de très nombreux exemples sur le net pour ces librairies

j’ai testé la solution @Francois puis j’ai testé en m’appuyant sur l’exemple de sendWithUs.

aucune des 2 ne fonctionne.
concernant le body, j’attends une réponse de la personne qui a développé le ws.

A suivre …

Pour que l’on puisse vous guider vers la bonne solution il faut les specs du WS ou des exemples complets avec les headers HTTP ou les commandes curl qui marchent, etc.

j’ai utilisé les libs commons HTTP Apache et ça fonctionne.

Tant mieux, peut on avoir le code qui marche pour voir en quoi ce que l’on fait dans Tool.readUrl est différent sachant que ça marche quand même dans de nombreux cas…

Merci d’avance

voilà mon code.
Pas très propre pour le moment … l’ajout des destinataires ne sera pas en dur :)

    //creating map object to create JSON object from it
var jsonValues = new java.util.HashMap();
jsonValues.put("in_message",message);
jsonValues.put("in_typeMedia",typeMedia);
jsonValues.put("in_competence",competence);
var JSONObjectjson = new JSONObject(jsonValues);
var destinataires= new JSONArray();
var destinataire= new JSONObject();
destinataire.put("destinataire","0672760794");
destinataire.put("statut","");
destinataire.put("liste_noire","");
destinataires.put(destinataire);
var destinataire2= new JSONObject();
destinataire2.put("destinataire","0684090140");
destinataire2.put("statut","");
destinataire2.put("liste_noire","");
destinataires.put(destinataire2);
JSONObjectjson.put("mem_destinataires",destinataires);

var client = new org.apache.http.impl.client.DefaultHttpClient();
var post = new org.apache.http.client.methods.HttpPost(url);
post.setHeader("Accept", "application/json");
post.setHeader("headerValue", "HeaderInformation");
// setting json object to post request.
var entity = new org.apache.http.entity.StringEntity(JSONObjectjson.toString(), "UTF8");
entity.setContentType(new org.apache.http.message.BasicHeader(org.apache.http.protocol.HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(entity);
// this is your response:
var response = client.execute(post);

Je pense que ce qui manquait dans votre appel à Tool.readUrl() c’était juste le header content type application/json (qui est aussi requis, par exemple par les services REST de Simplicité en POST et PUT).

Avec cette variante de Tool.readUrl il est possible d’ajouter des headers custom via une map, cf. https://www.simplicite.io/resources/4.0/javadoc/com/simplicite/util/Tool.html#readUrl-java.lang.String-java.lang.String-java.lang.String-java.lang.String-java.lang.Object-java.lang.Object-java.lang.String-

effectivement … ça fonctionne maintenant avec Tool.readUrl()

PS: On va voir s’il est pertinent dans le cas général de faire une évolution sur le Tool.readUrl pour qu’il ajoute automatiquement le header content type application/json si le body est de type org.json.JSONObject ou org.json.JSONArray et si la méthode est POST ou PUT

En fait, dans le doc https://www.simplicite.io/resources/documentation/01-core/third-party-apis-examples.md il y avait l’exemple (“MailJet”) faisait un appel avec positionnement de ce header :

(...)
headers.put("Content-type", HTTPTool.getMimeTypeWithEncoding(HTTPTool.MIME_TYPE_JSON));
(...)

Nous avons fait l’évolution sur Tool.readUrl: si le type de data passé est un org.json.JSONObject ou un org.json.JSONArray un header content type est automatiquement positionné à application/json

Un exemple d’appel POST avec un body JSON et une réponse JSON peut donc être désormais simplement du genre:

var res= new JSONObject(Tool.readUrl(url, new JSONObject().put("hello", "world")));