Incluso si este hilo ha aceptado la respuesta, siéntase libre de proponer otras ideas, sí usa o le gusta
He conocido estos artículos:
Y eso me llevó a este video de Google I / O 2010 sobre aplicaciones cliente REST
Desde ahora, he estado creando un componente REST como componente estático en mi clase de controlador de aplicación.
A partir de ahora, creo, debería cambiar el patrón. Alguien señaló que la aplicación Google IOSched es una gran muestra de cómo escribir clientes REST en Android. Alguien más dijo que esta forma es demasiado complicada.
Entonces, ¿alguien puede mostrarnos cuál es la mejor práctica? De forma breve y sencilla.
La aplicación IOSched es demasiado compleja para un caso de uso de muestra.
Respuestas:
EDICIÓN 2 (octubre de 2017):
Estamos en 2017. Solo use Retrofit. Casi no hay razón para usar otra cosa.
EDITAR:
La respuesta original tiene más de un año y medio en el momento de esta edición. Aunque los conceptos presentados en la respuesta original aún se mantienen, como señalan otras respuestas, ahora existen bibliotecas que facilitan esta tarea. Más importante aún, algunas de estas bibliotecas manejan los cambios de configuración del dispositivo por usted.
La respuesta original se conserva a continuación como referencia. Pero también tómese el tiempo para examinar algunas de las bibliotecas cliente de Rest para Android para ver si se ajustan a sus casos de uso. La siguiente es una lista de algunas de las bibliotecas que he evaluado. De ninguna manera pretende ser una lista exhaustiva.
Respuesta original:
Presentando mi enfoque para tener clientes REST en Android. Aunque no digo que sea el mejor :) Además, tenga en cuenta que esto es lo que se me ocurrió en respuesta a mi requisito. Es posible que deba tener más capas / agregar más complejidad si su caso de uso lo exige. Por ejemplo, no tengo ningún almacenamiento local; porque mi aplicación puede tolerar la pérdida de algunas respuestas REST.
Mi enfoque usa solo
AsyncTask
s bajo las sábanas. En mi caso, "llamo" a estas Tareas desde miActivity
instancia; pero para tener en cuenta completamente casos como la rotación de pantalla, puede optar por llamarlos desde unaService
o tal.Elegí conscientemente mi propio cliente REST para que fuera una API. Esto significa que la aplicación que usa mi cliente REST ni siquiera necesita conocer las URL REST reales y el formato de datos utilizado.
El cliente tendría 2 capas:
Capa superior: el propósito de esta capa es proporcionar métodos que reflejen la funcionalidad de la API REST. Por ejemplo, podría tener un método Java correspondiente a cada URL en su API REST (o incluso dos, uno para GET y otro para POST).
Este es el punto de entrada a la API del cliente REST. Esta es la capa que la aplicación usaría normalmente. Podría ser un singleton, pero no necesariamente.
Esta capa analiza la respuesta de la llamada REST en un POJO y la devuelve a la aplicación.
Esta es la
AsyncTask
capa de nivel inferior , que utiliza métodos de cliente HTTP para salir y hacer esa llamada REST.Además, elegí usar un mecanismo de devolución de llamada para comunicar el resultado de los mensajes de correo electrónico
AsyncTask
a la aplicación.Basta de texto. Veamos algo de código ahora. Tomemos una URL de API REST hipotética: http://myhypotheticalapi.com/user/profile
La capa superior podría verse así:
Tenga en cuenta que la aplicación no usa JSON o XML (o cualquier otro formato) devuelto directamente por la API REST. En cambio, la aplicación solo ve el bean
Profile
.Entonces, la capa inferior (capa AsyncTask) podría verse así:
Así es como una aplicación puede usar la API (en un
Activity
oService
):Espero que los comentarios sean suficientes para explicar el diseño; pero me complacerá brindar más información.
fuente
GetResponseCallback
más genérico. La que prefiero es usar una interfaz de marcador : Me gustainterface IGetResopnse{}
para denotar todas las clases que podrían ser respuestas. Entonces, tengoclass Profile implements IGetResponse
etc. Por último, hacenGetResponseCallback
genérico conIGetResponse
que el límite superior :public abstract class GetResponseCallback<? extends IGetResponse>
."El desarrollo de aplicaciones cliente REST para Android" de Virgil Dobjanschi generó mucha discusión, ya que no se presentó el código fuente durante la sesión ni se proporcionó posteriormente.
La única implementación de referencia que conozco (comente si sabe más) está disponible en Datadroid (la sesión de Google IO se menciona en / presentación). Es una biblioteca que puede usar en su propia aplicación.
El segundo enlace solicita el "mejor" marco REST, que se analiza en profundidad en stackoverflow. Para mí, el tamaño de la aplicación es importante, seguido del rendimiento de la implementación.
Por lo tanto, me quedo con org.json o GSON para escenarios más complejos. Para la arquitectura de una implementación org.json, estoy usando una clase estática que representa los casos de uso del servidor (por ejemplo, findPerson, getPerson). Llamo a esta funcionalidad desde un servicio y uso clases de utilidad que están haciendo el mapeo (específico del proyecto) y la IO de red (mi propia plantilla REST para GET o POST simple). Intento evitar el uso de la reflexión.
fuente
Nunca use AsynTask para realizar solicitudes de red o cualquier otra cosa que deba persistir. Async Task está fuertemente ligada a su actividad y si el usuario cambia la orientación de la pantalla desde que se vuelve a crear la aplicación, AsyncTask se detendrá.
Le sugiero que utilice el patrón de servicio con Intent Service y ResultReceiver. Eche un vistazo a RESTDroid . Es una biblioteca que le permite realizar cualquier tipo de solicitud REST de forma asincrónica y notificar a su interfaz de usuario con los oyentes de solicitudes que implementan el patrón de servicio de Virgil Dobjanschi.
fuente
Hay otra biblioteca con una API mucho más limpia y datos con seguridad de tipos. https://github.com/kodart/Httpzoid
Aquí hay un ejemplo de uso simple
O más complejo con devoluciones de llamada
Es nuevo y fresco, pero parece muy prometedor.
fuente
Hay muchas bibliotecas y estoy usando esta: https://github.com/nerde/rest-resource . Esto fue creado por mí y, como puede ver en la documentación, es mucho más limpio y simple que los demás. No está enfocado en Android, pero lo estoy usando y está funcionando bastante bien.
Es compatible con la autenticación básica HTTP. Hace el trabajo sucio de serializar y deserializar objetos JSON. Te gustará, especialmente si tu API es similar a Rails.
fuente
Descargo de responsabilidad: estoy involucrado en el proyecto de código abierto rest2mobile
Otra alternativa como cliente REST es utilizar rest2mobile .
El enfoque es ligeramente diferente, ya que utiliza ejemplos de descanso concretos para generar el código de cliente para el servicio REST. El código reemplaza la URL REST y las cargas útiles JSON con métodos Java nativos y POJO. También maneja automáticamente las conexiones del servidor, las invocaciones asincrónicas y las conversiones de POJO a / desde JSON.
Tenga en cuenta que esta herramienta viene en diferentes sabores (cli, complementos, soporte para android / ios / js) y puede usar el complemento de estudio de Android para generar la API directamente en su aplicación.
Todo el código se puede encontrar en github aquí .
fuente
Hemos abierto nuestra biblioteca de cliente REST asíncrona liviana para Android, puede resultarle útil si tiene requisitos mínimos y no desea manejar el subproceso múltiple usted mismo: está muy bien para comunicaciones básicas pero no para un cliente REST completo biblioteca.
Se llama libRESTfulClient y se puede encontrar en GitHub .
fuente