Wie kann ich POST-Anfrage in JSON mit HTTPClient in Android senden?

Ich versuche herauszufinden, wie man POST JSON von Android mit HTTPClient. Ich habe versucht, dies für eine Weile herauszufinden, ich habe viele Beispiele online gefunden, aber ich kann keine von ihnen zu arbeiten. Ich glaube, das liegt an meinem Mangel an JSON / Networking Wissen im Allgemeinen. Ich weiß, es gibt viele Beispiele da draußen, aber könnte jemand mich auf ein tatsächliches Tutorial? Ich suche einen Schritt für Schritt Prozess mit Code und Erklärung, warum Sie jeden Schritt machen, oder von dem, was dieser Schritt tut. Es muss nicht ein komplizierter, einfacher genügen.

Wieder, ich weiß, es gibt eine Menge von Beispielen da draußen, ich bin nur auf der Suche nach einem Beispiel mit einer Erklärung, was genau passiert ist und warum es so ist.

  • Benachrichtigungssymbol beim Herunterladen der Datei
  • Wie implementiere ich Android App Links mit Wildcard Domains?
  • So erkennen Sie Berührungsereignisse in Android
  • Cordova 3.5.0 Installationsfehler - Bitte installieren Sie Android Target 19
  • Android: Wie entwerfe ich Bild für Splash-Screen?
  • Wie baue ich Produkt-Aromen von Android Studio?
  • Wenn jemand über ein gutes Android-Buch darüber weiß, dann lass es mich wissen.

    Nochmals vielen Dank für die Hilfe @terrance, hier ist der Code, den ich unten beschrieben habe

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

  • Gradle schließt Plugin im Hauptprojekt für spezifische Teilprojekte aus
  • Android SharedPreferences in Fragment
  • Kontext in einem PreferenceFragment
  • Uses-sdk-Element kann kein Attribut "tools: node" haben
  • data.getExtras () erhalten ("data") Ergebnis von Bild mit niedriger Auflösung in Android
  • Einschließlich anderer Eclipse-Projekte in einem Android-Anwendungsprojekt
  • 5 Solutions collect form web for “Wie kann ich POST-Anfrage in JSON mit HTTPClient in Android senden?”

    In dieser Antwort benutze ich ein Beispiel von Justin Grammens .

    Über JSON

    JSON steht für JavaScript-Objektnotation. In JavaScript-Eigenschaften kann man beide wie dieses object1.name und mögen dieses object['name']; . Das Beispiel aus dem Artikel verwendet dieses Stück von JSON.

    Die Teile
    Ein Fan-Objekt mit E-Mail als Schlüssel und foo@bar.com als Wert

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

    So wäre das fan.email; Oder fan['email']; . Beide hätten den gleichen Wert von 'foo@bar.com' .

    Über HttpClient Anfrage

    Das Folgende ist, was unser Autor verwendet, um eine HttpClient Anfrage zu machen. Ich behaupte nicht, ein Experte auf all dies zu sein, wenn jemand einen besseren Weg hat, um etwas von der Terminologie frei zu fühlen.

     public static HttpResponse makeRequest(String 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 string builder/entity StringEntity se = new StringEntity(holder.toString()); //sets the post request as the resulting string 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); } 

    Karte

    Wenn Sie mit der Kartendatenstruktur nicht vertraut sind, schauen Sie sich bitte die Java Map Referenz an . Kurz gesagt, eine Karte ähnelt einem Wörterbuch oder einem Hash.

     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 String key = (String)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((String)pairs2.getKey(), (String)pairs2.getValue()); } //puts email and 'foo@bar.com' together in map holder.put(key, data); } return holder; } 

    Bitte fühlen Sie sich frei, irgendwelche Fragen zu kommentieren, die sich über diesen Beitrag ergeben, oder wenn ich nicht etwas klar gemacht habe oder wenn ich etwas nicht berührt habe, das du immer noch verwirrt hast … usw., was auch immer in deinem Kopf pops.

    (Ich werde es abnehmen, wenn Justin Grammens nicht zustimmt. Aber wenn nicht, dann danke Justin dafür, dass es kühl ist.)

    Aktualisieren

    Ich habe gerade geschehen, um einen Kommentar zu bekommen, wie man den Code benutzt und erkannte, dass es einen Fehler in der Rückgabetyp gab. Die Methode Signatur wurde gesetzt, um einen String zurückzugeben, aber in diesem Fall war es nicht alles zurückzugeben. Ich änderte die Signatur zu HttpResponse und verweise Sie auf diesen Link auf Getting Response Körper von HttpResponse die Pfadvariable ist die URL und ich aktualisiert, um einen Fehler in den Code zu beheben.

    Hier ist eine alternative Lösung für die Antwort von @ Terrance. Sie können die Umwandlung einfach auslagern. Die Gson-Bibliothek macht wunderbare Arbeit, um verschiedene Datenstrukturen in JSON umzuwandeln und umgekehrt.

     public static void execute() { Map<String, String> comment = new HashMap<String, String>(); comment.put("subject", "Using the GSON library"); comment.put("message", "Using libraries is convenient."); String json = new GsonBuilder().create().toJson(comment, Map.class); makeRequest("http://192.168.0.1:3000/post/77/comments", json); } public static HttpResponse makeRequest(String uri, String json) { try { HttpPost httpPost = new HttpPost(uri); httpPost.setEntity(new StringEntity(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; } 

    Ähnliches kann man mit Jackson anstelle von Gson machen. Ich empfehle auch einen Blick auf Retrofit, die eine Menge von diesem Boilerplate Code für Sie versteckt. Für erfahrene Entwickler empfehle ich RxAndroid auszuprobieren .

    Ich empfehle diese HttpURLConnection stattdessen HttpGet . Da HttpGet bereits in Android API Level 22 veraltet ist.

     HttpURLConnection httpcon; String url = null; String data = null; String 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")); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } br.close(); result = sb.toString(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

    Zu viel Code für diese Aufgabe, checkout diese Bibliothek https://github.com/kodart/Httpzoid Ist verwendet GSON intern und bietet API, die mit Objekten arbeitet. Alle JSON Details sind versteckt.

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

    Es gibt verschiedene Möglichkeiten, HHTP-Verbindung herzustellen und Daten aus einem RESTFULL-Webdienst abzurufen. Das jüngste ist GSON. Aber bevor du mit GSON fortfährst, musst du eine Vorstellung von der traditionellsten Art, einen HTTP Client zu erstellen und eine Datenkommunikation mit einem entfernten Server durchzuführen. Ich habe beide Methoden erwähnt, um POST & GET-Anfragen mit HTTPClient zu senden.

     /** * This method is used to process GET requests to the server. * * @param url * @return String * @throws IOException */ public static String connect(String 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 = convertStreamToString(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 String postHTPPRequest(String URL, String 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) { StringEntity tmp = null; tmp = new StringEntity(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(); String res = convertStreamToString(input); return res; } } catch (Exception e) { System.out.print(e.toString()); } return null; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.