Uso de HttpClient y HttpPost en Android con parámetros de publicación

Estoy escribiendo código para una aplicación de Android que se supone que debe tomar datos, empaquetarlo como Json y publicarlo en un servidor web, que a su vez se supone que debe responder con json.

El uso de una solicitud GET funciona bien, pero por alguna razón, al utilizar POST, parece que todos los datos se eliminan y el servidor no recibe nada.

Aquí hay un fragmento del código:

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 postParams = new ArrayList(); 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; 

Creo que seguí las pautas generales sobre cómo crear los parámetros y publicarlos, pero aparentemente no.

Cualquier ayuda o sugerencia sobre dónde encontrar una solución, son bienvenidos en este punto (después de pasar unas horas al darse cuenta de que nunca se enviaron datos de publicaciones). El servidor real ejecuta Wicket en Tomcat, pero también lo probé en una página PHP simple, sin diferencias.

¿Has intentado hacerlo sin el objeto JSON y acabas de pasar dos pares básicos de nombre y valor? Además, podría tener algo que ver con su configuración de servidor

Actualización: esta es una pieza de código que uso:

 InputStream is = null; ArrayList nameValuePairs = new ArrayList(); 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()); } 

En realidad, puede enviarlo como JSON de la siguiente manera:

 // 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); 

Acabo de verificar y tengo el mismo código que tú y funciona perfectamente. La única diferencia es cómo llené mi lista para los params:

Yo uso un ArrayList params : ArrayList params

y llenarlo de esta manera:

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

No uso ningún JSONObject para enviar parámetros a los servicios web.

¿Estás obligado a usar JSONObject?