martes, 28 de febrero de 2017

Hernan Centeno
En este artículo veremos como consumir un servicio JSON en Android 



Un servicio JSON (JavaScript Object Notation) es un formato para el intercambios de datos entre el cliente y el servidor que se usa para identificar y gestionar los datos. JSON nació como una alternativa a XML, el fácil uso en javascript ha generado un gran numero de seguidores de esta alternativa. Una de las mayores ventajas que tiene el uso de JSON es que puede ser leído por cualquier lenguaje de programación permitiéndonos el intercambio de información entre distintas tecnologías.

Ahora si tenemos la siguiente lista de frutas: 
   -Manzana
   -Pera
   -Babana
   -Sandía

El Json de nuestras frutas será:
     {"JSONFrutas":[{"fruta":"Manzana"},
     {"fruta":"Pera"},
     {"fruta":"Babana"},
     {"fruta":"Sandía"},]}

Debemos tener en cuenta que nuestro JSON debe estar en algún servidor o en nuestra computadora localmente, para este ejemplo asumiremos que nuestro JSON se encuentra en la siguiente dirección:
http://serviciojson/frutas


Consumo en Android
Para el consumo de nuestro json en Android necesitaremos de dos complemento que se encuentran en la siguiente dirección: https://1drv.ms/f/s!AgM8FiaC93RaiMoN8uqOpllzjWCMig en donde se encuentran los siguientes archivos:

Dentro de la carpeta "com" encontraremos los complementos necesarios para hacer las peticiones a la url, y el "gson-2.3.1" es un jar el cual lo incluiremos en nuestro proyecto.

Una vez que creamos nuestro proyecto nos vamos a Android copiamos la carpeta "com" y lo en la carpeta java.

De la misma manera para agregar el "gson-2.3.1" nos vamos a project/app/libs dentro de la carpeta libs pegamos el "gson-2.3.1"


Lo que acabmos de agregar a nuestro proyecto nos permite hacer peticiones desde una url, lo siguiente que debemos hacer es conceder los permisos para que Android pueda hacer peticiones a internet para lo cual nos dirigimos al AndroidManifest.xml de nuestro proyecto que se encuentra dentro de Project Files src/main

Aquí debemos agragar los siguientes permisos:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SEND_SMS"/>

Quedando de la siguiente manera:
A continuación vamos al main para realizar el consumo de nuestro servicio json y mostrarlo en un ListView cabe recalcar que al iniciar nuestra aplicación en nuestra pantalla se mostrará una lista con el resultado de la consulta para lo cual usaremos el siguiente código  que nos define la interfaz que incluye un TextView (Título de la aplicación) y un ListView(Muestra el resultado de la consulta) :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainactivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="hernanchos.com.mensajes.formEnvioMensajes">
<TextView
android:text="Listado de Frutas y sus Colores"
android:textSize="18dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:textColor="@android:color/black"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="50dp"
android:layout_marginBottom="50dp"
android:id="@+id/listFrutas"
android:textColor="@android:color/black"
android:layout_centerHorizontal="true"
/>
<Button
android:text="Enviar Mensaje"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnEnviarMensajes"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>

Ahora para el consumo de nuestro servicio servicio y que el mismo sea visualizado en pantalla nos dirigimos a nuestro java main en donde escribiremos el siguiente código:

public class formFruta extends AppCompatActivity {
ListView listFrutas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity);
listFrutas= (ListView) findViewById(R.id.listFrutas); HttpClient cliente = new HttpClient(new OnHttpRequestComplete() {
@Override
public void onComplete(Response status) {
if (status.isSuccess()) {
Gson gson = new GsonBuilder().create();
try {
JSONObject jsonOb = new JSONObject(status.getResult());
vectJSON = jsonOb.getJSONArray("JSONFrutas");
String[] vecString = new String[100];
for (int i = 0; i < vectJSON.length(); i++) {
JSONObject jsonFruta = vectJSON.getJSONObject(i);
vecString[i] = (jsonFruta.getString("fruta"));
}
listFrutas.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, vecString));
} catch (Exception e) {
Toast.makeText(formEnvioMensajes.this, "Compruebe su conexión a internet", Toast.LENGTH_SHORT).show();
}
}
}
});
cliente.excecute("http://serviciosjson/frutas");
El código anterior lo explicaré de mejor manera:
Primero declararemos un ListView en donde se mostrará el resultado de la consulta
ListView listFrutas;
Identificamos nuestro ListView de la vista por el id
listFrutas= (ListView) findViewById(R.id.listFrutas);
Declaramos una variable de tipo HttpClient para hacer las peticiones a nuestro json
HttpClient cliente = new HttpClient(new OnHttpRequestComplete() {
Especificamos la ruta de donde se encuentra nuestro JSON
cliente.excecute("http://serviciosjson/frutas");
Preguntamos si la consulta tuvo éxito:
if (status.isSuccess()) {
Declaramos un JSONObject en el cual al momento de instaciarlo especificaremos el resultado
del status de la consulta del HttpClient
JSONObject jsonOb = new JSONObject(status.getResult());
Declaramos en JSONArray en donde obtendremos un Array con el reusltado de la consulta
pero debemos especificar el ecabezado de mi servicio JSON (en este caso "JSONFrutas")
JSONArray vectJSON = jsonOb.getJSONArray("JSONFrutas");
En un vector de String iremos almacenando la infromacion obtenida una vez que
deserializemos el JSON con el objetivo de mostrar en la lista
String[] vecString = new String[100];
A continuación recorremos nuestro JSONArray, y dentro del bucle declaramos un
JSONObject en el cual vamos q especificar los datos de la consulta posición por posición del
JSONArray finalmente en el vector de String iremos almacenando el resultado del
JSONObject especificando el nombre del campo tal como se tiene en el JSON
for (int i = 0; i < vectJSON.length(); i++) {
JSONObject jsonFruta = vectJSON.getJSONObject(i);
vecString[i] = (jsonFruta.getString("fruta"));
}
Para finalizar en nuestra listFrutas agregamos un ArrayAdapter en el cual enviamos el vector
de String con el resultado de la búsqueda que será visto en la interfaz
listFrutas.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, vecString));