2010-12-12 5 views
14

Ich kann nicht die HttpParams-Zeug von der Android-API arbeiten.Kann HttpParams nicht mit Postrequest arbeiten

Ich möchte einfach einige einfache Parameter mit meinem Postrequest senden. Alles funktioniert gut, außer den Parametern. Der Code der Parameter auf die postrequest einzustellen:

HttpParams params = new BasicHttpParams(); 
params.setParameter("password", "secret"); 
params.setParameter("name", "testuser"); 
postRequest.setParams(params); 

Es scheint, dass dieser Code keine Parameter überhaupt ist das Hinzufügen, wie der Server immer antworten, dass meine Anfrage ist die „name“ -Parameter fehlt.

Ein Beispiel dafür, was wie erwartet tatsächlich arbeiten:

ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
postParameters.add(new BasicNameValuePair("name", "testuser")); 
postParameters.add(new BasicNameValuePair("password", "secret")); 
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
postRequest.setEntity(formEntity); 

Aber ich möchte eine Version des ersten Beispiels verwenden, da es einfacher ist, zu lesen und zu verstehen.

Jeder Hinweis wird wirklich geschätzt!

+1

+1 - Das gleiche Problem hier ... wechselte zu ArrayList und alles funktioniert jetzt ... verstehe nicht, warum die gleiche Logik mit HttpParams nicht funktioniert! – Vladimir

Antwort

2

Sobald ich das gleiche Problem hatte, und ich löste es auf die gleiche Weise wie Sie ... Ich erinnere mich, ich fand ein Thema darüber, warum das nicht funktionierte. Es war etwas über die Implementierung der Apache-Bibliothek auf der Serverseite.

Leider kann ich dieses Thema jetzt nicht finden, aber wenn ich Sie wäre, würde ich es einfach laufen lassen und würde mir nicht so viel Sorgen um die "Eleganz" des Codes machen, denn wahrscheinlich gibt es nicht viel, was Sie können tun, und wenn Sie können, ist es überhaupt nicht praktisch.

+3

Ja, das stimmt, aber ich verstehe es nicht. Warum gibt es eine API für HttpParams, wenn sie offensichtlich gar nicht funktioniert? –

1

Versucht, es funktioniert die erste Möglichkeit, aber es scheint HttpParams Schnittstelle ist nicht dafür vorgesehen, dafür gebaut werden. Nachdem eine Weile gegoogelt, ich this SO answer es zu erklären gefunden:

Die HttpParams Schnittstelle gibt es nicht für Query-String-Parameter spezifiziert, dann ist es für Laufzeitverhalten der Httpclient-Objekt angibt.

Die Dokumentation ist nicht so spezifisch, aber:

HttpParams Schnittstelle stellt eine Sammlung von unveränderlichen Werten, die eine Laufzeitverhalten einer Komponente definieren. auch

public HttpResponse securityCheck(String loginUrl, String name, String password) { 
    AndroidHttpClient client = AndroidHttpClient.newInstance(null); 
    HttpPost requestLogin = new HttpPost(
      loginUrl + "?"); 

    //Set my own params using NamaValuePairs 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("j_username", name)); 
    params.add(new BasicNameValuePair("j_password", password)); 

    //Set the timeouts using the wrapped HttpParams 
    HttpParams httpParameters = client.getParams(); 
    int timeoutConnection = 3000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    int timeoutSocket = 5000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
    try { 
     requestLogin 
       .setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
     HttpResponse response = client.execute(requestLogin); 
     return response; 
    } catch (Exception e) { 
     Log.e(TAG, e.getMessage(), e); 
     return null; 
    }finally { 
     client.close(); 
    } 
} 

See:

Für den Anschluss und Anfrage-Timeouts einstellen, ich habe eine Mischung aus beidem HttpParams und List<NameValuePair>, das und nutzt die AndroidHttpClient Klasse, erhältlich von API 8 voll funktionsfähig ist verwendet :