Saltar al contenido

¿Cómo enviar una solicitud POST en JSON usando HTTPClient en Android?

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 HttpURLConnectionen 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *