CONSUMIR WCF CON ANDROID SEGUNDA PARTE

Hola chicos que tal buen dia. En el tutorial anterior aprendimos a cómo desarrollar el servicios web (WCF) Ver aquí, hoy aprenderemos a como consumir lo servicios web mediante android. Para ello ya debemos tener creado nuestro proyecto android, pero si deseas saber como crear un proyecto en android puedes Ver aquí.

Paso 1: Importar la librería HTTP.

Ahora en tu proyecto abrimos el build.gradle file y añadimos la siguiente instrucción para hacer referencia a la librería HTTP y sincronizamos.
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
como se muestra en la imagen.

Paso 2: Crear una interfaz.

Vamos a crear una interfaz como se muestra en la imagen de abajo.


Para crear la interfaz aqui les dejo el código xml.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".Principal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Usuario" android:id="@+id/s" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ETUsuario" android:layout_below="@+id/s" android:layout_alignParentStart="true" android:layout_alignParentEnd="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="contraseña" android:id="@+id/textView" android:layout_below="@+id/ETUsuario" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ETContrasena" android:layout_below="@+id/textView" android:layout_alignParentStart="true" android:layout_alignEnd="@+id/ETUsuario" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Iniciar sesion" android:id="@+id/aceptar" android:layout_below="@+id/ETContrasena" android:layout_toEndOf="@+id/textView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="respuesta:" android:id="@+id/res" android:layout_centerVertical="true" android:layout_toEndOf="@+id/s" /> </RelativeLayout>

Paso 3: Crear una clase JsonGet

Esta clase se encargará de enviar los datos por medio del método get con HttpGet. el cual obtendremos la respuesta con httpResponse y lo convertiremos a json.
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

    public class JsonGet {
        /**VARIABLES QUE UTILIZAREMOS**/
        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";
        /*Metodo llamado getJSON que resive una url y retorna un Objeto json*/
        public JSONObject getJSON(String url) {

            /* iniciamos el try para tratar los errores*/
            try {
                /*iniciamos el objeto httpget con el parametro url*/
                HttpGet httpGet = new HttpGet(url);
                /*obtenemos los parametros basicos para una conexion*/
                HttpParams httpParameters = new BasicHttpParams();
                /*creamos un cliente http */
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                /* el httpclient. execute se encargar de enviar los datos al servidor y lo guardamos la respuesta en response*/
                HttpResponse httpResponse = httpClient.execute(httpGet);
                /*obtenemos la entidad (registro) de respuesta*/
                HttpEntity httpEntity = httpResponse.getEntity();
                /*aqui validamos el codigo de estado http si es 200 significa que fue exitosa la comunicacion*/
                if(httpResponse.getStatusLine().getStatusCode()==200){
                    Log.i("Server response"," exitosa");
                    /*GUARDAMOS el contenido en el inputstream*/
                    is = httpEntity.getContent();
                } else {
                    Log.i("respuesta del servidor ", "fallo la respuesta" );
                    /*Si no exite comunicacion en el servidor retornamos null*/
                    return  null;
                }
                /*si existe alguna excepcion de error lo cachamos*/
            } catch (IOException e) {
                e.printStackTrace();
                /*si hay error retornamos null*/
                return null;
            }
            try {
                /*guardamos en el buffer el contenido codificandolo al formato de codificación de caracteres Unicode*/
                BufferedReader reader = new BufferedReader(new InputStreamReader( is, "utf-8"), 8);
                /*iniciamos el almacenamiento en String*/
                StringBuilder sb = new StringBuilder();
                String line = null;
                /*Recorremos el contenido linea por linea mientras no sea null*/
                while ((line = reader.readLine()) != null) {
                    /*almacenamos lo datos en la cadena String con salto de linea */
                    sb.append(line + "n");
                }
                /*Cerramos el inputStream*/
                is.close();
                /*Conevertimos la cadena a objeto json */
                jObj = new JSONObject(sb.toString());
            } catch (Exception e) {
                Log.e("Buffer Error", "Error al convertir el dato" + e.toString());
                return  null;
            }
            /*Retornamos el objeto json*/
            return jObj;
        }
    } 

Paso 4: Creación de una clase sincrónica (AsyncTask) dentro de la clase principal.

Creamos una clase que sea asíncrona para no tener problemas con el hilo principal. Para ello utilizaremos AsyncTask
nota: Esta clase la crearemos dentro de la clase principal debajo de Oncreate. De igual forma olvides la ip y el puerto donde se encuentra alojado el web service.
  /*Clase encargada de enviar los datos a la clase JsonGet en segundo plano*/
    public  class getDato extends AsyncTask <String,String,JSONObject>{
        /*variable donde guardaremos el json en formato array*/
        public JSONArray data;
        /*metodo de asynctask que se ejeuta primero*/
        /*a qui ponemos el progresdialog*/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        /*metodo que se ejecuta el cuerpo del programa resive como parametro un arreglo String*/
        @Override
        protected JSONObject doInBackground(String... args) {
            /*aqui llamamos a la clase JsonGet*/
            JsonGet jParser = new JsonGet();
            /*creamos el objeto json para guardar los datos obtenidos*/
            JSONObject json = null;
            try {
                // obtenemos el json desde la url con el metodo getJSON de la clase JsonGet y lo guardamos en el obtejo json
                json = jParser.getJSON("http://192.168.160.45:9090/Service1.svc/usuario/" + Uri.encode(args[0], HTTP.UTF_8) +"/contrasena/"+Uri.encode(args[1], HTTP.UTF_8));

            } catch (Exception e) {
                /*si existe error lo cachamos*/
                e.printStackTrace();
            }
            /*regresmos el json que resibimos de la url*/
            return json;
        }
        /*Metodo que se ejecuta al finilizar dobackground que resive el json k retornamos del dobackground*/
        @Override
        protected void onPostExecute(JSONObject json) {
                try {
                    /*guardamos el arrajson en la variable data
                    *
                    * nota; LoginResult es el nombre de arrayJson ejemplo.
                    *      {"LoginResult":[{"res":"success"}]}
                    */
                    data = json.getJSONArray("LoginResult");
                    /*Aqui obtenemos el primer valor del arreglo selecionandolo con la posicion 0*/
                    JSONObject c = data.getJSONObject(0);
                    /*Aqui guardamos reuperamos el primer valor de tipo String "res" se llama la columna*/
                    String id = c.getString("res");
                    /*Despejamos el valor en nuestro texview*/
                    res.setText(id);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
        }
    }
Ahora vamos a llamar a la clase getDato con el OnclickListener desde el método Oncreate.

  

  /*Variables que utilizamos para hacer referencia a los componenetes de la interfaz*/
    EditText user,contra;
    TextView res;
    Button acep;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        /*Llamamos a los componenetes para poder utilizar sus propiedades*/
        user = (EditText)findViewById(R.id.ETUsuario);
        contra =(EditText) findViewById(R.id.ETContrasena);
        acep = (Button)findViewById(R.id.aceptar);
        res = (TextView)findViewById(R.id.res);
        /*creamos la accion de clic al boton*/
        acep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*LLamada al metodo getDato. y le enviamos el usuario y contraseña que escribimos en las cajas de texto */
                new getDato().execute(user.getText().toString(), contra.getText().toString());
            }
        });
    }
    
 
Quedando así en la clase Principal completa.

    

import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Principal extends AppCompatActivity {

/*Variables que utilizamos para hacer referencia a los componenetes de la interfaz*/
    EditText user,contra;
    TextView res;
    Button acep;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        /*Llamamos a los componenetes para poder utilizar sus propiedades*/
        user = (EditText)findViewById(R.id.ETUsuario);
        contra =(EditText) findViewById(R.id.ETContrasena);
        acep = (Button)findViewById(R.id.aceptar);
        res = (TextView)findViewById(R.id.res);
        /*creamos la accion de clic al boton*/
        acep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*LLamada al metodo getDato. y le enviamos el usuario y contraseña que escribimos en las cajas de texto */
                new getDato().execute(user.getText().toString(), contra.getText().toString());
            }
        });
    }    

/*Clase encargada de enviar los datos a la clase JsonGet en segundo plano*/
    public  class getDato extends AsyncTask <String,String,JSONObject>{
        /*variable donde guardaremos el json en formato array*/
        public JSONArray data;
        /*metodo de asynctask que se ejeuta primero*/
        /*a qui ponemos el progresdialog*/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        /*metodo que se ejecuta el cuerpo del programa resive como parametro un arreglo String*/
        @Override
        protected JSONObject doInBackground(String... args) {
            /*aqui llamamos a la clase JsonGet*/
            JsonGet jParser = new JsonGet();
            /*creamos el objeto json para guardar los datos obtenidos*/
            JSONObject json = null;
            try {
                // obtenemos el json desde la url con el metodo getJSON de la clase JsonGet y lo guardamos en el obtejo json
                json = jParser.getJSON("http://192.168.160.45:9090/Service1.svc/usuario/" + Uri.encode(args[0], HTTP.UTF_8) +"/contrasena/"+Uri.encode(args[1], HTTP.UTF_8));

            } catch (Exception e) {
                /*si existe error lo cachamos*/
                e.printStackTrace();
            }
            /*regresmos el json que resibimos de la url*/
            return json;
        }
        /*Metodo que se ejecuta al finilizar dobackground que resive el json k retornamos del dobackground*/
        @Override
        protected void onPostExecute(JSONObject json) {
                try {
                    /*guardamos el arrajson en la variable data
                    *
                    * nota; LoginResult es el nombre de arrayJson ejemplo.
                    *      {"LoginResult":[{"res":"success"}]}
                    */
                    data = json.getJSONArray("LoginResult");
                    /*Aqui obtenemos el primer valor del arreglo selecionandolo con la posicion 0*/
                    JSONObject c = data.getJSONObject(0);
                    /*Aqui guardamos reuperamos el primer valor de tipo String "res" se llama la columna*/
                    String id = c.getString("res");
                    /*Despejamos el valor en nuestro texview*/
                    res.setText(id);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
        }
    }
} 

Paso 5: Agregar los permisos de red al Manifest.

Para realizar operaciones de red, nuestro manifiesto debe incluir los siguientes permisos:
android.permission.INTERNET:Permiso para que nuestra app acceda al internet.
android.permission.ACCESS_NETWORK_STATE: Permiso para obtener el estado de acceso a la red.
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
quedando nuestro manifest de esta forma.

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.wcfandroid.nsc.wcfandroid" >     <uses-permission android:name="android.permission.INTERNET"></uses-permission>     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>     <application         android:allowBackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme">
        <activity             android:name=".Principal"             android:label="@string/app_name">             <intent-filter>                 <action android:name="android.intent.action.MAIN"/>                 <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>         </activity>
   </application></manifest>

Paso 6: Resultado.







Descargar código completo, explicado del web service (WCF) y android usando el método Get.

Descargar


Comprar código Completo, explicado, WCF y android usando el método POST


Nota: Cualquier inconveniente con su descarga comunicate con nosotros aquí