34 votes

Utilisation de HttpClient et HttpPost dans Android avec des paramètres de publication

Je suis à l'écriture de code pour une application sur Android qui est censé prendre les données, de les emballer sous forme de Json et l'envoyer à un serveur web, qui à son tour est censé répondre avec json.

À l'aide d'une requête GET fonctionne très bien, mais pour une raison quelconque à l'aide de POST toutes les données semble l'avoir dépouillé et le serveur ne reçoit rien.

Voici un extrait du code:

HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);        
DefaultHttpClient httpClient = new DefaultHttpClient(params);
BasicCookieStore cookieStore = new BasicCookieStore();
httpClient.setCookieStore(cookieStore);

String uri = JSON_ADDRESS;
String result = "";
String username = "user";
String apikey = "something";
String contentType = "application/json";

JSONObject jsonObj = new JSONObject();

try {
    jsonObj.put("username", username);
    jsonObj.put("apikey", apikey);
} catch (JSONException e) {
    Log.e(TAG, "JSONException: " + e);
}

HttpPost httpPost = new HttpPost(uri);
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("json", jsonObj.toString()));
HttpGet httpGet = null;
try {
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParams);
    entity.setContentEncoding(HTTP.UTF_8);
    entity.setContentType("application/json");
    httpPost.setEntity(entity);

    httpPost.setHeader("Content-Type", contentType);
    httpPost.setHeader("Accept", contentType);
} catch (UnsupportedEncodingException e) {
    Log.e(TAG, "UnsupportedEncodingException: " + e);
}

try {
    HttpResponse httpResponse = httpClient.execute(httpPost);
    HttpEntity httpEntity = httpResponse.getEntity();

    if (httpEntity != null) {
        InputStream is = httpEntity.getContent();
        result = StringUtils.convertStreamToString(is);
        Log.i(TAG, "Result: " + result);
    }
} catch (ClientProtocolException e) {
    Log.e(TAG, "ClientProtocolException: " + e);
} catch (IOException e) {
    Log.e(TAG, "IOException: " + e);
}

return result;

Je pense avoir suivi les directives générales sur la façon de créer les paramètres et de les poster, mais apparemment pas.

De l'aide ou des pointeurs vers où je peux trouver une solution, ce sont les bienvenus à ce moment (après avoir passé quelques heures réalisant pas de données post a jamais été envoyé). Le vrai serveur est en cours d'exécution de Guichet sur Tomcat, mais j'ai aussi testé sur une simple page PHP, avec aucune différence.

46voto

Jaime Botero Points 1314

Vous pouvez réellement l’envoyer en tant que JSON de la manière suivante:

 // Build the JSON object to pass parameters
JSONObject jsonObj = new JSONObject();
jsonObj.put("username", username);
jsonObj.put("apikey", apikey);
// Create the POST object and add the parameters
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpPost);
 

29voto

Andreas Points 714

Avez-vous essayé de le faire sans l'objet JSON et venez de passer deux paires de bases de données d'évaluation de base? aussi, cela pourrait avoir quelque chose à voir avec vos paramètres de serveur

Mise à jour: ceci est un morceau de code que j'utilise:

 InputStream is = null;
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("lastupdate", lastupdate)); 

try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(connection);
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        Log.d("HTTP", "HTTP: OK");
    } catch (Exception e) {
        Log.e("HTTP", "Error in http connection " + e.toString());
    }
 

0voto

Alexandre Nucera Points 655

Je viens de vérifier et j'ai le même code que vous et cela fonctionne parfaitement. La seule différence est la façon dont je remplis ma liste pour les paramètres:

J'utilise a: ArrayList<BasicNameValuePair> params

et remplissez-le de cette façon:

  params.add(new BasicNameValuePair("apikey", apikey);
 

Je n’utilise aucun objet JSON pour envoyer des paramètres aux services Web.

Êtes-vous obligé d'utiliser JSONObject?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X