Posteriormente a consultar con expertos en esta materia, programadores de diversas áreas y profesores dimos con la solución al dilema y la dejamos plasmada en esta publicación.
Solución:
En esta respuesta estoy usando un ejemplo publicado por Justin Grammens.
Acerca de JSON
JSON significa Notación de objetos de JavaScript. En las propiedades de JavaScript se puede hacer referencia a ambas de esta manera object1.name
y así object['name'];
. El ejemplo del artículo usa este bit de JSON.
Las partes
Un objeto de abanico con correo electrónico como key y [email protected] como un valor
fan:
email : '[email protected]'
Así que el objeto equivalente sería fan.email;
o fan['email'];
. Ambos tendrían el mismo valor de '[email protected]'
.
Acerca de la solicitud HttpClient
Lo siguiente es lo que nuestro autor usó para hacer una solicitud HttpClient. No pretendo ser un experto en todo esto, así que si alguien tiene una mejor manera de expresar parte de la terminología, siéntase libre.
public static HttpResponse makeRequest(String path, Map params) throws Exception
//instantiates httpclient to make request
DefaultHttpClient httpclient = new DefaultHttpClient();
//url with the post data
HttpPost httpost = new HttpPost(path);
//convert parameters into JSON object
JSONObject holder = getJsonObjectFromMap(params);
//passes the results to a string builder/entity
StringEntity se = new StringEntity(holder.toString());
//sets the post request as the resulting string
httpost.setEntity(se);
//sets a request header so the page receving the request
//will know what to do with it
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
//Handles what is returned from the page
ResponseHandler responseHandler = new BasicResponseHandler();
return httpclient.execute(httpost, responseHandler);
Mapa
Si no está familiarizado con el Map
estructura de datos, eche un vistazo a la referencia de Java Map. En resumen, un mapa es similar a un diccionario o un hash.
private static JSONObject getJsonObjectFromMap(Map params) throws JSONException
//all the passed parameters from the post request
//iterator used to loop through all the parameters
//passed in the post request
Iterator iter = params.entrySet().iterator();
//Stores JSON
JSONObject holder = new JSONObject();
//using the earlier example your first entry would get email
//and the inner while would get the value which would be '[email protected]'
// fan: email : '[email protected]'
//While there is another entry
while (iter.hasNext())
//gets an entry in the params
Map.Entry pairs = (Map.Entry)iter.next();
//creates a key for Map
String key = (String)pairs.getKey();
//Create a new map
Map m = (Map)pairs.getValue();
//object for storing Json
JSONObject data = new JSONObject();
//gets the value
Iterator iter2 = m.entrySet().iterator();
while (iter2.hasNext())
Map.Entry pairs2 = (Map.Entry)iter2.next();
data.put((String)pairs2.getKey(), (String)pairs2.getValue());
//puts email and '[email protected]' together in map
holder.put(key, data);
return holder;
Siéntase libre de comentar cualquier pregunta que surja sobre esta publicación o si no he dejado algo claro o si no he tocado algo sobre lo que todavía está confundido… etc. lo que se le ocurra realmente.
(Lo eliminaré si Justin Grammens no lo aprueba. Pero si no, gracias a Justin por ser genial al respecto).
Actualizar
Recibí un comentario sobre cómo usar el código y me di cuenta de que había un error en el tipo de retorno. La firma del método se configuró para devolver un string pero en este caso no estaba devolviendo nada. Cambié la firma a HttpResponse y lo remitiré a este enlace en Cómo obtener el cuerpo de respuesta de HttpResponse el variable de ruta es la url y la actualicé para corregir un error en el código.
Aquí hay una solución alternativa a la respuesta de @Terrance. Puede subcontratar fácilmente la conversión. La biblioteca Gson hace un trabajo maravilloso al convertir varias estructuras de datos en JSON y viceversa.
public static void execute()
Map comment = new HashMap();
comment.put("subject", "Using the GSON library");
comment.put("message", "Using libraries is convenient.");
String json = new GsonBuilder().create().toJson(comment, Map.class);
makeRequest("http://192.168.0.1:3000/post/77/comments", json);
public static HttpResponse makeRequest(String uri, String json)
try
HttpPost httpPost = new HttpPost(uri);
httpPost.setEntity(new StringEntity(json));
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
return new DefaultHttpClient().execute(httpPost);
catch (UnsupportedEncodingException e)
e.printStackTrace();
catch (ClientProtocolException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
return null;
Se puede hacer algo similar usando Jackson en lugar de Gson. También recomiendo echar un vistazo a Retrofit, que oculta gran parte de este código repetitivo. Para desarrolladores más experimentados, recomiendo probar RxAndroid.
Recomiendo usar esto HttpURLConnection
en lugar de HttpGet
. Como HttpGet
ya está en desuso en el nivel 22 de la API de Android.
HttpURLConnection httpcon;
String url = null;
String data = null;
String result = null;
try
//Connect
httpcon = (HttpURLConnection) ((new URL (url).openConnection()));
httpcon.setDoOutput(true);
httpcon.setRequestProperty("Content-Type", "application/json");
httpcon.setRequestProperty("Accept", "application/json");
httpcon.setRequestMethod("POST");
httpcon.connect();
//Write
OutputStream os = httpcon.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(data);
writer.close();
os.close();
//Read
BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),"UTF-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null)
sb.append(line);
br.close();
result = sb.toString();
catch (UnsupportedEncodingException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
Comentarios y calificaciones del tutorial
Recuerda que tienes la opción de agregar una reseña si diste con el resultado.