Http-Post mit Parametern... wie?

Ich versuche gerade einen Http-Post mit Parametern an einen Server abzusetzen, was mir aber nicht gelingen will. Die Parameter kommen nie beim Server an.

Version 1: (funkioniert nicht!)

  HttpPost post = new HttpPost(url);
  
  List<NameValuePair> postParams = new ArrayList<NameValuePair>();
  for(String key:params.keySet()){
    postParams.add(new BasicNameValuePair(key, params.get(key));
  }
  
  post.addEntity(new UrlEncodedFormEntity(postParams));
  return post;
}```

Version 2 (funktioniert nicht!)
``` private static HttpPost buildRequest(final String url, final Map<String, String> params) throws UnsupportedEncodingException {
  HttpPost post = new HttpPost(url);
  
  final HttpParams postParams = new BasicHttpParams();
  for(String key:params.keySet()){
    postParams.setParameter(key, params.get(key));
  }
  
  post.setParams(postParams);
  return post;
}```

Version 3 (funktioniert, aber bestimmt so nicht gewollt)
``` private static HttpPost buildRequest(final String url, final Map<String, String> params) throws UnsupportedEncodingException {
        final StringBuilder uri = new StringBuilder(url);
        boolean first = true;
        
        for (final String name : params.keySet()) {
            uri.append(first ? "?" : "&");
            first = false;
            
            uri.append(URLEncoder.encode(name, HTTP.UTF_8));
            uri.append("=");
            uri.append(URLEncoder.encode(params.get(name), HTTP.UTF_8));
        }
        return new HttpPost(uri.toString());
    }```

Und so schick ich den Request ab:

"
[spoiler]```private InputStream sendRequest(final HttpPost request) {
        InputStream result = null;
        try {
            final HttpClient httpClient = new DefaultHttpClient();
            final HttpResponse response = httpClient.execute(request);
            final HttpEntity entity = response.getEntity();
            result = entity.getContent();
        }
        catch (final Exception e) {
            throw new RuntimeException("Error sending request="+request, e);
        }
        
        return result;
    }```[/spoiler]


Bis auf Version 3 werden sonst die Parameter einfach weggelassen. Programmiere auf API-Level 16. Was mache ich falsch!? Kann doch nicht Sinn dieser ganzen APIs sein, dass ich mir den String am Ende doch selbst zusammenbasteln muss!? :mad:

Programmiere auf API-Level 16. Was mache ich falsch!?

  1. Du verwendest WebClient obwohl seit Version 2.3 von Google nicht mehr empfohlen.
  2. Du verwendest nicht die Google Volley Netzwerk-Library. Siehe auch (Android) Netzwerk-Kommunikation
  3. Dein 1. Beispiel weicht vom Apache-Beispiel in einer Kleinigkeit ab, nämlich im Beispiel wird setEntity und nicht addEntity verwendet. Ansonsten ist das der richtige Weg.

Ich kann vom WebClient nur abraten. Hatte einmal ein Projekt damit angefangen und musste dann mitten drin erst recht auf URLConnection ausweichen weil es einfach viel zu langsam auf Android war.

[QUOTE=schlingel]1. Du verwendest WebClient obwohl seit Version 2.3 von Google nicht mehr empfohlen.
2. Du verwendest nicht die Google Volley Netzwerk-Library. Siehe auch (Android) Netzwerk-Kommunikation

Ich kann vom WebClient nur abraten. Hatte einmal ein Projekt damit angefangen und musste dann mitten drin erst recht auf URLConnection ausweichen weil es einfach viel zu langsam auf Android war.[/QUOTE]Okay, wenn WebClient prinzipiell eine doofe Idee ist, dann kann ich am ehesten jetzt noch umstellen. Was würdest du mir denn empfehlen: Volley Library (die müsste ich mir extra runterladen?) oder URLConnection?

Volley + OkHttp = Wunderbar.

URLConnection ist sehr, sehr weit unten und man muss höllisch aufpassen wenn man Form-Data versenden will, dass man sich ja 100% an den HTTP-Standard hält. Hatte da böse Probleme.

Als ich das Projekt von dem ich weiter oben gesprochen habe übergab, hatte ich in der Zwischenzeit schon ein anderes Android-Projekt mit Google Volley u. OkHttp umgesetzt. Das erste was ich den Burschen gesagt habe war, dass sie mein Framework wegschmeißen sollen und sich lieber Google Volley anschauen sollen.