Consumir API json con Android

Hola que tal, Buenas. En esta entrega estaré realizando un tutorial de como consumir una api json con android, estaré trabajando con los recursos nativos de android, ósea nada de librerías de terceros por el momento.

Para realizar peticiones http estaremos usando las clases HTTPGet y HTTPPost ademas de los helpers para JSON JSONArray y JSONObject.

Dejaremos detrás la creación del proyecto y todo lo demás relacionado con el proyecto android, al final del día no es el objetivo en este tutorial.

Digamos que tenemos una api  «http://localhost.dev/country» que acepta métodos GET para retornar una lista de países y sus respectivas capitales, Algo como esto seria lo que retorna dicha api.

[
    {
        country: "Republica Dominicana",
        capital: "Santo Domingo"
    },
    {
        country: "Japon",
        capital: "Tokio"
    },
    {
        country: "Venezuela",
        capital: "Caracas"
    },
    {
        country: "Portugal",
        capital: "Lisboa"
    },
    {
        country: "Espana",
        capital: "Madrid"
    },
    {
        country: "Rusia",
        capital: "Moscow"
     },
     {
        country: "Colombia",
        capital: "Bogota"
     }
]

Una vez sabiendo la respuesta de nuestra api podemos construirle un cliente.

/service api url
String url = 'http://localhost.dev/country';

// declarar un client http en este caso DefaultHttpClient
HttpClient client = new DefaultHttpClient();

//Como nuestro servicio es un metodo get usamos HTTPGet
HttpGet request = new HttpGet(url);

HttpResponse response;
List entityResult;

try {
    //Ejecutamos el request ya compuesto
    response = client.execute(request);

    StatusLine statusLine = response.getStatusLine();

    //El statusLine retorna el resultado del request a nivel de statusCode
    //AKA ( 200,404,500,401,403... )
    if (statusLine.getStatusCode() == HttpStatus.SC_OK) {

        //Si queremos el resultado del servicio (json) debemos de obtenerlo del payload del request
        //Que es obtenido como un InputStream el cual tendremos que convertir a String
        InputStream in = response.getEntity().getContent();

        
        BufferedReader buffered = new BufferedReader(new InputStreamReader(in));
        StringBuilder fullLines = new StringBuilder();

        String line;
        
        // 
        while ((line = buffered.readLine()) != null) {
            fullLines.append(line);
        }

        String result = fullLines.toString()

        JSONArray objetos = new JSONArray(result);

        for(int i=0;i<objetos.length;i++){

            JSONObject objeto = new JSONObject(objetos[i]);

            /*

                cada objecto sera compuesto por esto
                {
                    country: "pais",
                    capital:"capital"
                }

            */

        }
    }
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Para obtener cualquier valor de nuestro objeto json basta con solo decir, mas detalles en la pagina de documentación de JSONObject

object.getString
object.getInt
object.JSONObject

Este método (wrap) es el que usaremos para convertir el inputStream a un String y poder parsearlo a JSON.

public static String inputStreamToString(InputStream in) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    StringBuilder sb = new StringBuilder();

    String line;

    while ((line = br.readLine()) != null) {
        sb.append(line);
    }

    return sb.toString();
}

Eso seria todo si todos los métodos fueran de tipo GET pero en ocasiones tenemos método que reciben solo POST y parámetros dentro del payload (JSON). El código seria bastante parecido, la diferencia principal es el uso de HTTPPost en vez de HTTPGet.

String url = 'url_to_you_server_api.dev/postservice'

HttpClient client = new DefaultHttpClient();

HttpPost request = new HttpPost(url);

JSONObject parametros = new JSONObject();

parametros.put("usuario","usuario");
parametros.put("clave","top_secret");

StringEntity jsonEntity = new StringEntity( dataJson.toString() );

HttpPost request = new HttpPost(url);

//Agregar esto ya que algunos frameworks (nodejs frameworks) necesitan esto
//para poder parsear los payloads automaticamente
request.addHeader("Content-Type","application/json");

//Se configura el payload a enviar al servicio
request.setEntity(jsonEntity);

//Ejecutamos el request ya compuesto
response = client.execute(request);

//De este punto en adelante es los mismo que una llamada GET al servicio.
StatusLine statusLine = response.getStatusLine();

Como pueden notar realizar llamadas POST y GET con android es bastante fácil y simple, Hoy día ya hay varios frameworks que abstraen esta funcionalidad de tener que realizar el request y parsear el JSON.

Android-async-http

robospice

Saludos.