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 detras la creacion del projecto y todo lo demas relacionado con el projecot android, al final del dia no es el objetivo en este tutorial.

Digamos que tenemos una api  “http://localhost.dev/country” que acepta metodos get para retornar una lista de paises 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) {

//

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

//
    objeto.getString
    objeto.getInt

    objecto.JSONObject

//

 
Este metodo (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 metodos fueran de tipo GET pero en ocaciones tenemos metodo que reciben solo POST y parametros dentro del payload (json). El codigo 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 facil y simple, Hoy dia ya hay varios frameowrks que abstraen esta funcionalidad de tener que relizar el request y parsear el json.

Android-async-http

robospice

Saludos.

You may also like...