Acceso a Servicios Web REST en Android (2/2)

En el artículo anterior dedicado a los servicios web REST hemos visto cómo crear fácilmente un servicio de este tipo utilizando el framework ASP.NET MVC 3. En esta segunda parte vamos a describir cómo podemos construir una aplicación Android que acceda a este servicio web REST.

Y tal como hicimos en el caso de SOAP, vamos a crear una aplicación de ejemplo que llame a las distintas funciones de nuestro servicio web. En este caso la aplicación se compondrá de 5 botones, uno por cada una de las acciones que hemos implementado en el servicio web (insertar, actualizar, eliminar, recuperar un cliente, y listar todos los clientes).

captura-inicial-rest

A diferencia del caso de SOAP, en esta ocasión no vamos a utilizar ninguna librería externa para acceder al servicio web, ya que Android incluye todo lo necesario para realizar la conexión y llamada a los métodos del servicio, y tratamiento de resultados en formato JSON.

Como ya hemos comentado, al trabajar con servicios web de tipo REST, las llamadas al servicio no se harán a través de una única URL, sino que se determinará la acción a realizar según la URL accedida y la acción HTTP utilizada para realizar la petición (GET, POST, PUT o DELETE). En los siguientes apartados veremos uno a uno la implementación de estos botones.

Insertar un nuevo cliente

Como ya comentamos en el artículo anterior, la inserción de un nuevo cliente la realizaremos a través de la siguiente URL:

http://10.0.2.2:2731/Api/Clientes/Cliente

Utilizaremos la acción http POST y tendremos que incluir en la petición un objeto en formato JSON que contenga los datos del nuevo cliente (tan sólo Nombre y Teléfono, ya que el ID se calculará automáticamente). El formato de este objeto de entrada será análogo al siguiente:

{Nombre:”cccc”, Telefono:12345678}

Pues bien, para conseguir esto comenzaremos por crear un nuevo objeto HttpClient, que será el encargado de realizar la comunicación HTTP con el servidor a partir de los datos que nosotros le proporcionemos. Tras esto crearemos la petición POST creando un nuevo objeto HttpPost e indicando la URL de llamada al servicio. Modificaremos mediante setHeader() el atributo http content-type para indicar que el formato de los datos que utilizaremos en la comunicación, que como ya indicamos será JSON (cuyo MIME-Type correspondiente es “application/json“).

HttpClient httpClient = new DefaultHttpClient();

HttpPost post =
    new HttpPost("http://10.0.2.2:2731/Api/Clientes/Cliente");

post.setHeader("content-type", "application/json");

El siguiente paso será crear el objeto JSON a incluir con la petición, que deberá contener los datos del nuevo cliente a insertar. Para ello creamos un nuevo objeto JSONObject y le añadimos mediante el método put() los dos atributos necesarios (nombre y teléfono) con sus valores correspondientes, que los obtenemos de los cuadros de texto de la interfaz, llamados txtNombre y txtTelefono.

Por último asociaremos este objeto JSON a nuestra petición HTTP convirtiéndolo primero al tipo StringEntity e incluyéndolo finalmente en la petición mediante el método setEntity().

//Construimos el objeto cliente en formato JSON
JSONObject dato = new JSONObject();

dato.put("Nombre", txtNombre.getText().toString());
dato.put("Telefono", Integer.parseInt(txtTelefono.getText().toString()));

StringEntity entity = new StringEntity(dato.toString());
post.setEntity(entity);

Una vez creada nuestra petición HTTP y asociado el dato de entrada, tan sólo nos queda realizar la llamada al servicio mediante el método execute() del objeto HttpClient y recuperar el resultado mediante getEntity(). Este resultado lo recibimos en forma de objeto HttpEntity, pero lo podemos convertir fácilmente en una cadena de texto mediante el método estático EntityUtils.toString().

HttpResponse resp = httpClient.execute(post);
String respStr = EntityUtils.toString(resp.getEntity());

if(respStr.equals("true"))
	lblResultado.setText("Insertado OK.");

En nuestro caso, el método de inserción devuelve únicamente un valor booleano indicando si el registro se ha insertado correctamente en la base de datos, por lo que tan sólo tendremos que verificar el valor de este booleano (“true” o “false”) para conocer el resultado de la operación, que mostraremos en la interfaz en una etiqueta de texto llamada lblResultado.

Actualizar un cliente existente

La URL utilizada para la actualización de clientes será la misma que la anterior:

http://10.0.2.2:2731/Api/Clientes/Cliente

Pero en este caso, el objeto JSON a enviar como entrada deberá contener no sólo los nuevos valores de nombre y teléfono sino también el ID del cliente a actualizar, por lo que tendría una estructura análoga a la siguiente:

{Id:123, Nombre:”cccc”, Telefono:12345678}

Para actualizar el cliente procederemos de una forma muy similar a la ya comentada para la inserción, con las únicas diferencias de que en este caso la acción HTTP utilizada será PUT (objeto HttpPut) y que el objeto JSON de entrada tendrá el campo ID adicional.

HttpClient httpClient = new DefaultHttpClient();

HttpPut put = new HttpPut("http://10.0.2.2:2731/Api/Clientes/Cliente");
put.setHeader("content-type", "application/json");

try
{
	//Construimos el objeto cliente en formato JSON
	JSONObject dato = new JSONObject();

	dato.put("Id", Integer.parseInt(txtId.getText().toString()));
	dato.put("Nombre", txtNombre.getText().toString());
	dato.put("Telefono", Integer.parseInt(txtTelefono.getText().toString()));

	StringEntity entity = new StringEntity(dato.toString());
	put.setEntity(entity);

      	HttpResponse resp = httpClient.execute(put);
       	String respStr = EntityUtils.toString(resp.getEntity());

       	if(respStr.equals("true"))
       		lblResultado.setText("Actualizado OK.");
}
catch(Exception ex)
{
       	Log.e("ServicioRest","Error!", ex);
}

Eliminación de un cliente

La eliminación de un cliente la realizaremos a través de la URL siguiente:

http://10.0.2.2:2731/Api/Clientes/Cliente/id_cliente

donde id_cliente será el ID del cliente a eliminar. Además, utilizaremos la acción http DELETE (objeto HttpDelete) para identificar la operación que queremos realizar. En este caso no será necesario pasar ningún objeto de entrada junto con la petición, por lo que el código quedará aún más sencillo que los dos casos anteriores.

HttpClient httpClient = new DefaultHttpClient();

String id = txtId.getText().toString();

HttpDelete del =
	new HttpDelete("http://10.0.2.2:2731/Api/Clientes/Cliente/" + id);

del.setHeader("content-type", "application/json");

try
{
       	HttpResponse resp = httpClient.execute(del);
       	String respStr = EntityUtils.toString(resp.getEntity());

      	if(respStr.equals("true"))
       		lblResultado.setText("Eliminado OK.");
}
catch(Exception ex)
{
      	Log.e("ServicioRest","Error!", ex);
}

Como podéis ver, al principio del método obtenemos el ID del cliente desde la interfaz de la aplicación y lo concatenamos con la URL base para formar la URL completa de llamada al servicio.

Obtener un cliente

Esta operación es un poco distinta a las anteriores, ya que en este caso el resultado devuelto por el servicio será un objeto JSON y no un valor simple como en los casos anteriores. Al igual que en el caso de eliminación de clientes, la URL a utilizar será del tipo:

http://10.0.2.2:2731/Api/Clientes/Cliente/id_cliente

En este caso utilizaremos un tipo de petición http GET (objeto HttpGet) y la forma de realizar la llamada será análoga a las anteriores. Donde aparecerán las diferencias será a la hora de tratar el resultado devuelto por el servicio tras llamar al método getEntity(). Lo que haremos será crear un nuevo objeto JSONObject a partir del resultado textual de getEntity(). Hecho esto, podremos acceder a los atributos del objeto utilizando para ello los métodos get() correspondientes, según el tipo de cada atributo (getInt(), getString(), etc). Tras esto mostraremos los datos del cliente recuperado en la etiqueta de resultados de la interfaz (lblResultados).

HttpClient httpClient = new DefaultHttpClient();

String id = txtId.getText().toString();

HttpGet del =
	new HttpGet("http://10.0.2.2:2731/Api/Clientes/Cliente/" + id);

del.setHeader("content-type", "application/json");

try
{
       	HttpResponse resp = httpClient.execute(del);
       	String respStr = EntityUtils.toString(resp.getEntity());

       	JSONObject respJSON = new JSONObject(respStr);

       	int idCli = respJSON.getInt("Id");
       	String nombCli = respJSON.getString("Nombre");
       	int telefCli = respJSON.getInt("Telefono");

       	lblResultado.setText("" + idCli + "-" + nombCli + "-" + telefCli);
}
catch(Exception ex)
{
      	Log.e("ServicioRest","Error!", ex);
}

Una vez más como podéis comprobar el código es muy similar al ya visto para el resto de operaciones.

Obtener listado completo de clientes

Por último vamos a ver cómo podemos obtener el listado completo de clientes. El interés de esta operación está en que el resultado recuperado de la llamada al servicio será un array de objetos de tipo cliente, por supuesto en formato JSON. La acción http utilizada será una vez más la acción GET, y la URL para recuperar el listado de clientes será:

http://10.0.2.2:2731/Api/Clientes

De nuevo, la forma de llamar al servicio será análoga a las anteriores hasta la llamada a getEntity() para recuperar los resultados. En esta ocasión, dado que recibimos un array de elementos, convertiremos este resultado a un objeto JSONArray, y hecho esto podremos acceder a cada uno de los elementos del array mediante una llamada a getJSONObject(), al que iremos pasando el índice de cada elemento. Para saber cuántos elementos contiene el array podremos utilizar el método length() del objeto JSONArray. Por último, el acceso a los atributos de cada elemento del array lo realizamos exactamente igual como ya lo hicimos en la operación anterior de obtención de cliente por ID.

HttpClient httpClient = new DefaultHttpClient();

HttpGet del =
	new HttpGet("http://10.0.2.2:2731/Api/Clientes");

del.setHeader("content-type", "application/json");

try
{
       	HttpResponse resp = httpClient.execute(del);
       	String respStr = EntityUtils.toString(resp.getEntity());

       	JSONArray respJSON = new JSONArray(respStr);

       	String[] clientes = new String[respJSON.length()];

       	for(int i=0; i<respJSON.length(); i++)
       	{
       		JSONObject obj = respJSON.getJSONObject(i);

        	int idCli = obj.getInt("Id");
        	String nombCli = obj.getString("Nombre");
        	int telefCli = obj.getInt("Telefono");

       		clientes[i] = "" + idCli + "-" + nombCli + "-" + telefCli;
       	}

       	//Rellenamos la lista con los resultados
       	ArrayAdapter<String> adaptador =
       	       	new ArrayAdapter<String>(ServicioWebRest.this,
		        android.R.layout.simple_list_item_1, clientes);

	lstClientes.setAdapter(adaptador);
}
catch(Exception ex)
{
       	Log.e("ServicioRest","Error!", ex);
}

Tras obtener nuestro array de clientes, para mostrar los resultados hemos añadido a la interfas de nuestra aplicación de ejemplo un control tipo ListView (llamado lstClientes) que hemos rellenado a través de su adaptador con los datos de los clientes recuperados.

A modo de ejemplo, en la siguiente imagen puede verse el resultado de ejecutar la operación de listado completo de clientes:

captura-final-rest

Y con esto hemos terminado. Espero haber ilustrado con claridad en los dos últimos artículos la forma de construir servicios web tipo REST mediante ASP.NET y aplicaciones cliente Android capaces de acceder a dichos servicios.

Como siempre, podéis descargar el código fuente completo de este artículo mediante este enlace.

, , , , , , ,

35 Respuestas a Acceso a Servicios Web REST en Android (2/2)

  1. YoGo 19/03/2012 at 17:53 #

    Sgoliver muy buen material, esperamos la parte 5 de este tema donde nos enseñes como implementarlo en un terminal real.

  2. admin 19/03/2012 at 20:12 #

    Hola YoGo, en un terminal real sería exactamente igual, no habría cambios en el código, tan sólo tendrías que cambiar la URL del servicio web por la del servicio real (online) al que quieras acceder.

  3. kisler 09/04/2012 at 22:55 #

    Buenas, excelente blog, me gustaria saber si hay algun servicio de creacion de bbdd online gratuito que soporte REST para realizar pruebas, un saludo :)

  4. Juan jose 11/04/2012 at 16:33 #

    buenas sera que podraias hacer un tutorial para el uso de handlers para los mensajes. muchas gracias

  5. Luis E 13/04/2012 at 5:59 #

    excelente información… pero como se podría en lugar de mostrar la lista de clientes… generar una búsqueda de cliente a la BD y mostrar la información del cliente??? bueno se que ya con lo que has dado hay bastante info pero bueno tu que eres el máster me podrías ilustrar.

  6. Javier Solis 23/04/2012 at 20:27 #

    Hola , pero si quisiera enviar algo como esto

    &%/&%&YTSAUóéúíí89008 878/(/))hjsjdhsjdhsjhdjs?????sss

    tambien si quisiera enviarlo como atributo en alguna clase , se que da error , como se recuelve

  7. Gabriel 09/05/2012 at 15:03 #

    Hola, que buen material, pero tengo un par de preguntas. Hace un tiempo realice algo similar pero usando servicios en java, y cuando trabajaba en esto me encontraba con una excepcion de que las operaciones de red no deben estar en el hilo principal, que debia hacer una asynctask para correr las peticiones Http, me pregunto porque en este caso la aplicacion no da quejas por esto si todo se encuentra en la misma actividad? tambien si quisiera hacerlo en un hilo aparte que se deberia cambiar? buen tutorial de nuevo, fue de mucha ayuda

  8. Fernando 17/05/2012 at 20:10 #

    Hola Amigo, muy interesante tu articulo, pero no lo puedo echar a andar, con el web service no hay problema, lo hice paso a paso y lo pruebo desde mi explorador y si lo puedo consumir, pero el problema es en la aplicación android, (no hay errores de sintaxis), ya me fije que sea el mismo puerto, la ip pues la deje igual (10.0.2.2) que es la que hay que dejar por default (sustituye a127.0.0.1 cierto? ), se ejectuta la aplicación correctamente, pero los botones de insertar, actualizar y eliminar, no hacen nada al darles clic, pero tampoco marca error) y en los botones en Obtener y de Listar ahi si me marca error, varios errores, el primero es:

    org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject

    podrías ayudarme por favor?
    De antemano muchas gracias, si gustas puedes contactarme a mi email por si necesitas mi código o algo.
    saludos !!!

  9. Fulano de Tal 19/05/2012 at 6:07 #

    Hola, buen sitio y tutoriales.

    Hablando de este en particular. Me gustaría conocer tu punto de vista acerca de las Ventajas, Desventajas en comparativa con el uso de servlets en java vs REST. Se que este ejemplo lo hiciste con .net pero es igual para java.

    A lo que voy es en el performance del aplicativo, manejo de errores, soporte de peticiones, seguridad. etc.etc.

    Ya que la comunicación con android es muy similar mediante http y con json dado el caso.

    Saludos.

  10. Fernando 22/05/2012 at 14:55 #

    Alguien lo pudo echar a andar??? podrían pasar el código funcionando?

  11. Arnau 24/05/2012 at 17:36 #

    Buenas, primero, excelente trabajo con tu blog, ya no puedo contar las veces que me ha salvado.
    Pero resulta que tengo un problema en la parte de tu codigo que usas la funcion “respJSON.getJSONObject(i);”, ya que a mi me dice que solo acepta Strings, no int. Usas alguna version especifica de Android? Podrias quizas concretar que imports usas?

    Muchas gracias por todo.

  12. gian 15/06/2012 at 21:49 #

    ola una pregunta copmo uedo validar si una url es valida..porke cuando pongo una url invalida se cae la palicacion…alguna idea de poner un validador..para ver si no me trae la respuesta en x segundos mandar un mensaje??..lo que pasa esque necesito poner la ip en un edittext..gracias.

  13. Juan 03/07/2012 at 0:28 #

    Hola! Muchisimas gracias por este tutorial!

    Tengo una duda, en caso de que quisiera hacer un HttpPost de un tipo DateTime desde android, como podria resolverlo?

    Desde java, hago: dato.put(“FechaNacimiento”, new Date());

    El tema es que al recibirlo desde MVC 3, el campo FechaNacimiento no viene con la fecha correcta.. Imagino que ASP no sabe como manejar la fecha en formato JSON.

    Gracias!

  14. Victor 14/07/2012 at 17:52 #

    Hola, gracias por el curso, me está sirviendo de mucho.
    Tengo un problema con esta parte, la cosa es que estoy desarrollando una aplicacion que hace uso de un servidor, y entonces cuando hago peticiones, las meto en un asynctask porque si no no me deja hacer… mi problema es que si pongo un dialog para que el usuario no diga “esto se ha bloqueado”, lo hago correctamente, pongo la creación en onpreexecute y el dismiss en onpostexecute, pero tan sólo sale una vez se ha completado la operación, y no consigo dar con la solución a ello.
    Tras mucho darle vueltas llegué a la conclusión de que las peticiones http bloquean el ui thread, pero por mucho que intente esto y aquello creando threads adicionales y demás, no consigo solucionar el problema.
    Si pudieras darme una solución te lo agradecería mucho.

  15. mauricio 16/07/2012 at 16:55 #

    hola Exelente tutorial, tengo la duda como separo en otra clase de java este codigo, o sea, tengo un activity prinipal y quiero separar este codigo en otro Activity o clase
    Saludos!!!

  16. glading 20/07/2012 at 23:40 #

    Hola, respondiendo a Yogo comentaste que para probar en un terminar real (desde un celular) tendrias que cambiar la URL por la del servicio real (online). Podrias explicarlo mejor por favor? Como creo un servicio real? solo requiero una guia.

    Gracias

  17. Fading 23/07/2012 at 18:41 #

    Quiero enviar no solo un id, sino tambien un nombre de usuario y una contraseña al servicio, cual es la sintaxis para el servicio?

  18. Cabra 30/07/2012 at 20:23 #

    Buenas, tengo un problema con mi servidor rest y mi aplicacion android. el tutorial me ha ayudado mucho con inconcluencias que tenia en el codigo, pero ahora solo em funciona en local. Al poner la app android en la misma subred que el servidor y usando un router debidamente configurado (lo he puesto en modo DM> para abrir todo) el router me hace cosas raras y hace lo que quiere.
    pongo la IP de mi ordenador y el puerto 801 puesto que los HTTPGET y HTTPPOST van por ese puerto.
    sik alguien me puede ayudar se lo agradeceria encarecidamente.

    Muchas gracias

  19. fabian 01/08/2012 at 16:30 #

    Con tus tutoriales aprendi muchisimo muchas gracias!!!

    Necesito hacer un web service en lo posible en PHP vos haces tutoriales sobre eso o conoces algun sitio que valga la pena?

  20. José Antonio 07/08/2012 at 10:58 #

    Genial !
    Después de buscar y probar un montón de ejemplos es el primero que me funciona sin problemas.

    ¡Gracias!

  21. guisi 08/08/2012 at 4:09 #

    Si lo que quiero hacer son varias operaciones en distintas tablas , utilizo un stored procedure pero como trabajo en MVC3 y que tipo de peticion http realizo en android y como extraigo los datos de salida del stored procedure? Es posible?

    gracias,!

  22. antonio 16/10/2012 at 8:48 #

    hola a alguien le ha salido el ejemplo, yo he cambiado algunas cosas y me da un error en el web service de que no lo encuentra
    al crear el objeto que llama al servicio he probado así:

    HttpGet del =
    new HttpGet(“http://10.0.2.2/personas.php”);

    no se si falta el número de puerto, tambien he probado con elllo y no funciona:
    HttpGet del =
    new HttpGet(“http://10.0.2.2:80/personas.php”);

    alguna ayuda, este es el log:

    10-14 20:09:36.740: E/ServicioRestError(2416): Error!
    10-14 20:09:36.740: E/ServicioRestError(2416): java.net.SocketException: Network unreachable
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
    10-14 20:09:36.740: E/ServicioRestError(2416): at java.net.Socket.connect(Socket.java:1055)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    10-14 20:09:36.740: E/ServicioRestError(2416): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    10-14 20:09:36.740: E/ServicioRestError(2416): at com.example.serviciopersona.MainActivity$1.onClick(MainActivity.java:66)
    10-14 20:09:36.740: E/ServicioRestError(2416): at android.view.View.performClick(View.java:2408)
    10-14 20:09:36.740: E/ServicioRestError(2416): at android.view.View$PerformClick.run(View.java:8818)
    10-14 20:09:36.740: E/ServicioRestError(2416): at android.os.Handler.handleCallback(Handler.java:587)
    10-14 20:09:36.740: E/ServicioRestError(2416): at android.os.Handler.dispatchMessage(Handler.java:92)
    10-14 20:09:36.740: E/ServicioRestError(2416): at android.os.Looper.loop(Looper.java:123)
    10-14 20:09:36.740: E/ServicioRestError(2416): at android.app.ActivityThread.main(ActivityThread.java:4627)
    10-14 20:09:36.740: E/ServicioRestError(2416): at java.lang.reflect.Method.invokeNative(Native Method)
    10-14 20:09:36.740: E/ServicioRestError(2416): at java.lang.reflect.Method.invoke(Method.java:521)
    10-14 20:09:36.740: E/ServicioRestError(2416): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    10-14 20:09:36.740: E/ServicioRestError(2416): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    10-14 20:09:36.740: E/ServicioRestError(2416): at dalvik.system.NativeStart.main(Native Method)

  23. makiina 24/10/2012 at 17:27 #

    Buenas a mi tampoco me llega a conectar con el webservice ,
    yo creo que aqui http://10.0.2.2:2731/Api/Clientes/Cliente/ lo que falla es el numero de puerto. ¿Alguna solución?

    Gracias

  24. Orlando 25/11/2012 at 19:01 #

    Buenas compañeros si funciona con las direcciones externas lo que deben de colocar es el numero de puerto para eso despues de la direccion ip le colocan el :80 que es el de comunicaciones y para probarlo en la maquina deben de verificar el puerto donde se ha montado el servicio en visual estudio eso puede cambiar solo corran la aplicacion una vez cargada en el navegador ahi aprecera localhost:2731 2731 es el puesto donde se ha montado ese puede variar

  25. andres 22/12/2012 at 2:20 #

    Para los que quieran saber como es el formato del JSON “http://www.cheesejedi.com/rest_services/get_big_cheese?level=1″ , con esa URL pueden hacer pruebas.

    [{"id":"755","level":"1","time_in_secs":"3","par":"0","initials":"KiB","quote":"Got'cha!","time_stamp":"2012-04-09 22:50:52"},{"id":"874","level":"1","time_in_secs":"3","par":"0","initials":"WJF","quote":"Look, Ma. No hands!","time_stamp":"2012-05-25 15:44:10"},{"id":"59","level":"1","time_in_secs":"4","par":"0","initials":"TMF","quote":"Hey hey ole ' hickery","time_stamp":"2012-03-03 04:36:15"},{"id":"61","level":"1","time_in_secs":"4","par":"0","initials":"WJF","quote":"I'm on a boat!","time_stamp":"2012-03-03 04:38:54"},{"id":"150","level":"1","time_in_secs":"4","par":"0","initials":"lja","quote":"Look, Ma. No hands!","time_stamp":"2012-03-04 00:57:02"}]

  26. beto 24/01/2013 at 0:01 #

    estoy realizando este ejemplo pero ahora ocupo qe ademas de traerme el los campos de texto me regrese una imagen y la muestre en un imageview como puedo hacerlo ???

  27. Jachumbelechao 24/01/2013 at 22:05 #

    Hola, esa muy bien el tutorial. Yo solo use la segunda parte, ya que el webservice lo hice con netbeans. Me gustaría saber que dirección ip poner en lugar de la 10.0.2.2 para depurarlo vía usb en el movil, porque en depurador me funciona a la perfección pero en el movil no tiene ninguna intención de depurar. He probado con varias ips y no consigo que funcione

  28. beto 26/01/2013 at 21:04 #

    ALGUIEN SABE COMO SOLUCIONAR ESTOS ERRORES:
    EL WEB SERVICE YA FUNCIONA

    UTILIZO SOLO STRING EN EL ID DE CLIENTE

    OBTENER 1 CLIENTE:
    org.json.JSONException: Value false of type java.lang.Boolean cannot be converted to JSONObject

    OBTENER UN LISTADO DE CLIENTES:
    org.json.JSONException: Value of type java.lang.String cannot be converted to JSONArray

  29. beto 07/02/2013 at 17:15 #

    como puedo enviar un parametro con tres valores con los cuales me traere la lista completa
    por ejemplo tengo una clase de tipo Parametros
    declaro:
    Parametros p = new Parametros() ;
    p.id = 1;
    p.filtro = “jugo”;
    p.num_res = “10″;
    aqui envio elparamaetro al webservice
    HttpGet del = new HttpGet(“http://10.0.2.2:49469/Api/Productos/” + p);

    pero en el web service me no me llega mas qe los de tipo string,int y eso.
    alguien sabe como puedo mandar este tipo de parametros??

  30. Rafa 20/02/2013 at 13:12 #

    Buenas, al recibir el JSON, obtengo esta respuesta:

    401 Unauthorized

    401 Unauthorized
    Your client does not have permission to get URL /Api/Clients from this server.

    y los consiguientes errores que conlleva esta recepción de datos,¿Que tengo que cambiar en mi ordenador para que todo el mundo tenga permisos o en el programa?

  31. Marcela 28/02/2013 at 14:55 #

    Gracias por los tutoriales, son excelentes…en mi aplicación ya funciona perfecto el sincronizar mi BD desde android en tiempo real…pero en el caso de que cuando este ingresando los datos no tenga servicio de internet? como puedo sincronizar mis datos en la bd del dispositivo con la bd en el servidor? …sin internet guardaria los datos en la bd del dispositivo pero como hago la sincronizacion despues?…porfavooor una ayudita!

  32. beto 28/02/2013 at 20:56 #

    hay alguna manera de enviar caracteres que no sean letras ni numeros en el HttpGet
    como por ejemplo = , & , % , $ , : , ; [, ] , { , } , etc.
    ya que me sale que envio un caracter ilegal

    java.lang.IllegalArgumentException: Illegal character in path at index 36: http://10.0.2.2:50108/Api/MiAplicacion/{“pag”:0,”funcion”:”1″}
    at java.net.URI.create(URI.java:970)

    hay alguna forma de que acepte estos valores???

  33. Edu 26/03/2013 at 15:00 #

    Hola a todos. Yo estoy intentando hacer funcionar el código desde el teléfono físico y un servicio real pero no lo consigo. Ahora mismo estoy en un punto que ya no se que probar.
    Alguien lo ha podido hacer funcionar desde el teléfono a través de una ip real ??

    Aprovecho también para agradecer los magníficos tutoriales de este curso, son una maravilla para dar los primeros pasos con el funcionamiento de aplicaciones en Android.

  34. Edu 10/04/2013 at 10:01 #

    Hola de nuevo. Finalmente conseguí hacer funcionar el servicio en IIS, que era el motivo por el cuál no podía realizar correctamente la conexión a través del teléfono con la aplicación instalada. Me faltaba añadir el Framework 4.0 al grupo de aplicaciones en IIS7.
    Gracias de nuevo. Saludines

  35. gustavo 02/05/2013 at 21:23 #

    Hola.. Todo muy bien.. solo que creo q tengo problemas encuanto al codigo de PHP que no.. retorna nada con el JSON.. Creo q mi error es en php.. ayuda.. solo quiero obtener todos los datos de una tabla.

Deja un comentario

Powered by WordPress. Designed by Woo Themes