Estoy escribiendo código para una aplicación Android que se supone que toma datos, los empaqueta como Json y los envía a un servidor web, que a su vez se supone que responde con Json.
Usando una petición GET funciona bien, pero por alguna razón usando POST todos los datos parecen ser despojados y el servidor no recibe nada.
Aquí's 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<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;
Creo que he seguido las directrices generales sobre cómo crear los parámetros y publicarlos, pero al parecer no.
Cualquier ayuda o punteros a donde puedo encontrar una solución, son muy bienvenidos en este punto (después de pasar un par de horas dándose cuenta de que nunca se enviaron los datos de correo). El servidor real está ejecutando Wicket en Tomcat, pero también lo he probado en una simple página PHP, sin ninguna diferencia.
En realidad puedes 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);
¿has probado a hacerlo sin el objeto JSON y pasando sólo dos pares de nombres básicos? Además, puede que tenga algo que ver con la configuración del servidor.
Actualización: este es un trozo de código que uso:
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());
}
Acabo de comprobar que tengo el mismo código que tú y funciona perfectamente. La única diferencia es cómo lleno mi lista de los parámetros:
Yo uso un : ArrayList<BasicNameValuePair> params
.
y lo lleno de esta manera:
params.add(new BasicNameValuePair("apikey", apikey);
No uso ningún JSONObject para enviar params a los webservices.
Está obligado a utilizar el JSONObject ?