Comment envoyer une requête POST dans JSON en utilisant HTTPClient dans Android?

J’essaie de comprendre comment POST JSON d’Android en utilisant HTTPClient. J’essaie de comprendre cela depuis un moment, j’ai trouvé plein d’exemples en ligne, mais je ne peux pas les faire travailler. Je crois que cela est dû à mon manque de connaissances JSON / réseau en général. Je sais qu’il y a beaucoup d’exemples là-bas, mais est-ce que quelqu’un pourrait m’indiquer un tutoriel? Je recherche un processus pas à pas avec du code et une explication des raisons pour lesquelles vous faites chaque étape, ou de ce que fait cette étape. Cela n’a pas besoin d’être compliqué, simple suffira.

Encore une fois, je sais qu’il y a une tonne d’exemples, je cherche simplement un exemple avec une explication de ce qui se passe exactement et pourquoi cela se passe ainsi.

Si quelqu’un connaît un bon livre Android à ce sujet, alors faites-le moi savoir.

Merci encore pour l’aide @terrance, voici le code que j’ai décrit ci-dessous

public void shNameVerParams() throws Exception{ Ssortingng path = //removed HashMap params = new HashMap(); params.put(new Ssortingng("Name"), "Value"); params.put(new Ssortingng("Name"), "Value"); try { HttpClient.SendHttpPost(path, params); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Dans cette réponse, j’utilise un exemple posté par Justin Grammens .

A propos de JSON

JSON signifie JavaScript Object Notation. Dans JavaScript, les propriétés peuvent être référencées à la fois comme ceci object1.name et comme cet object['name']; . L’exemple de l’article utilise ce bit de JSON.

Les parties
Un object fan avec email en tant que clé et foo@bar.com en tant que valeur

 { fan: { email : 'foo@bar.com' } } 

Donc l’équivalent de l’object serait fan.email; ou fan['email']; . Les deux auraient la même valeur de 'foo@bar.com' .

À propos de la demande HttpClient

Voici ce que notre auteur utilisait pour créer une demande HttpClient . Je ne prétends pas être un expert du tout, alors si quelqu’un a une meilleure façon de rédiger une partie de la terminologie, n’hésitez pas.

 public static HttpResponse makeRequest(Ssortingng path, Map params) throws Exception { //instantiates httpclient to make request DefaultHttpClient httpclient = new DefaultHttpClient(); //url with the post data HttpPost httpost = new HttpPost(path); //convert parameters into JSON object JSONObject holder = getJsonObjectFromMap(params); //passes the results to a ssortingng builder/entity SsortingngEntity se = new SsortingngEntity(holder.toSsortingng()); //sets the post request as the resulting ssortingng httpost.setEntity(se); //sets a request header so the page receving the request //will know what to do with it httpost.setHeader("Accept", "application/json"); httpost.setHeader("Content-type", "application/json"); //Handles what is returned from the page ResponseHandler responseHandler = new BasicResponseHandler(); return httpclient.execute(httpost, responseHandler); } 

Carte

Si vous ne connaissez pas la structure des données de la Map , veuillez consulter la référence de la carte Java . En bref, une carte est similaire à un dictionnaire ou à un hachage.

 private static JSONObject getJsonObjectFromMap(Map params) throws JSONException { //all the passed parameters from the post request //iterator used to loop through all the parameters //passed in the post request Iterator iter = params.entrySet().iterator(); //Stores JSON JSONObject holder = new JSONObject(); //using the earlier example your first entry would get email //and the inner while would get the value which would be 'foo@bar.com' //{ fan: { email : 'foo@bar.com' } } //While there is another entry while (iter.hasNext()) { //gets an entry in the params Map.Entry pairs = (Map.Entry)iter.next(); //creates a key for Map Ssortingng key = (Ssortingng)pairs.getKey(); //Create a new map Map m = (Map)pairs.getValue(); //object for storing Json JSONObject data = new JSONObject(); //gets the value Iterator iter2 = m.entrySet().iterator(); while (iter2.hasNext()) { Map.Entry pairs2 = (Map.Entry)iter2.next(); data.put((Ssortingng)pairs2.getKey(), (Ssortingng)pairs2.getValue()); } //puts email and 'foo@bar.com' together in map holder.put(key, data); } return holder; } 

N’hésitez pas à commenter les questions qui se posent à propos de cet article ou si je n’ai pas fait quelque chose de clair ou si je n’ai pas abordé quelque chose que vous avez encore confus au sujet de… etc.

(Je décrocherai si Justin Grammens n’approuve pas. Mais sinon, merci Justin pour être cool à ce sujet.)

Mettre à jour

Je viens juste de recevoir un commentaire sur la façon d’utiliser le code et je me suis rendu compte qu’il y avait une erreur dans le type de retour. La signature de la méthode était définie pour renvoyer une chaîne mais dans ce cas, elle ne renvoyait rien. J’ai changé la signature en HttpResponse et vous renverrai à ce lien dans Getting Response Body de HttpResponse la variable path est l’url et j’ai mis à jour pour corriger une erreur dans le code.

Voici une solution alternative à la réponse de @ Terrance. Vous pouvez facilement externaliser la conversion. La bibliothèque Gson fait un travail formidable en convertissant diverses structures de données en JSON et inversement .

 public static void execute() { Map comment = new HashMap(); comment.put("subject", "Using the GSON library"); comment.put("message", "Using libraries is convenient."); Ssortingng json = new GsonBuilder().create().toJson(comment, Map.class); makeRequest("http://192.168.0.1:3000/post/77/comments", json); } public static HttpResponse makeRequest(Ssortingng uri, Ssortingng json) { try { HttpPost httpPost = new HttpPost(uri); httpPost.setEntity(new SsortingngEntity(json)); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); return new DefaultHttpClient().execute(httpPost); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } 

On peut faire la même chose en utilisant Jackson à la place de Gson. Je recommande également de jeter un oeil à Retrofit qui cache beaucoup de ce code standard pour vous. Pour les développeurs plus expérimentés, je recommande d’essayer RxAndroid .

Je recommande d’utiliser cette HttpURLConnection place de HttpGet . Comme HttpGet est déjà obsolète au niveau 22 de l’API Android.

 HttpURLConnection httpcon; Ssortingng url = null; Ssortingng data = null; Ssortingng result = null; try { //Connect httpcon = (HttpURLConnection) ((new URL (url).openConnection())); httpcon.setDoOutput(true); httpcon.setRequestProperty("Content-Type", "application/json"); httpcon.setRequestProperty("Accept", "application/json"); httpcon.setRequestMethod("POST"); httpcon.connect(); //Write OutputStream os = httpcon.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(data); writer.close(); os.close(); //Read BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),"UTF-8")); Ssortingng line = null; SsortingngBuilder sb = new SsortingngBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } br.close(); result = sb.toSsortingng(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

Trop de code pour cette tâche, consultez cette bibliothèque https://github.com/kodart/Httpzoid Is utilise GSON en interne et fournit une API qui fonctionne avec des objects. Tous les détails JSON sont masqués.

 Http http = HttpFactory.create(context); http.get("http://example.com/users") .handler(new ResponseHandler() { @Override public void success(User[] users, HttpResponse response) { } }).execute(); 

Il existe plusieurs façons d’établir une connexion HHTP et d’extraire des données d’un service Web RESTFULL. Le plus récent est le GSON. Mais avant de passer à GSON, vous devez avoir une idée de la manière la plus traditionnelle de créer un client HTTP et effectuer une communication de données avec un serveur distant. J’ai mentionné les deux méthodes d’envoi de requêtes POST & GET à l’aide de HTTPClient.

 /** * This method is used to process GET requests to the server. * * @param url * @return Ssortingng * @throws IOException */ public static Ssortingng connect(Ssortingng url) throws IOException { HttpGet httpget = new HttpGet(url); HttpResponse response; HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. // The default value is zero, that means the timeout is not used. int timeoutConnection = 60*1000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 60*1000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient httpclient = new DefaultHttpClient(httpParameters); try { response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); result = convertStreamToSsortingng(instream); //instream.close(); } } catch (ClientProtocolException e) { Utilities.showDLog("connect","ClientProtocolException:-"+e); } catch (IOException e) { Utilities.showDLog("connect","IOException:-"+e); } return result; } /** * This method is used to send POST requests to the server. * * @param URL * @param paramenter * @return result of server response */ static public Ssortingng postHTPPRequest(Ssortingng URL, Ssortingng paramenter) { HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. // The default value is zero, that means the timeout is not used. int timeoutConnection = 60*1000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 60*1000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient httpclient = new DefaultHttpClient(httpParameters); HttpPost httppost = new HttpPost(URL); httppost.setHeader("Content-Type", "application/json"); try { if (paramenter != null) { SsortingngEntity tmp = null; tmp = new SsortingngEntity(paramenter, "UTF-8"); httppost.setEntity(tmp); } HttpResponse httpResponse = null; httpResponse = httpclient.execute(httppost); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { InputStream input = null; input = entity.getContent(); Ssortingng res = convertStreamToSsortingng(input); return res; } } catch (Exception e) { System.out.print(e.toSsortingng()); } return null; }