web-dev-qa-db-fra.com

Besoin d'un échantillon Android REST Projet client qui implémente Virgil Dobjanschi REST modèle d'implémentation)

Je veux créer un client REST sur un téléphone Android.

Le serveur REST expose plusieurs ressources, par exemple (GET)

http://foo.bar/customer      List of all customer
http://foo.bar/customer/4711    The customer with id 4711
http://foo.bar/customer/vip     List of all VIP customer

http://foo.bar/company           List of all companys
http://foo.bar/company/4711     The company with the ID 4711
http://foo.bar/company/vip      List of all VIP companys

Je (pense) que je sais comment parler au serveur REST et obtenir les informations dont j'ai besoin. J'implémenterais une classe client REST avec une API comme celle-ci)

public List<Customer> getCustomers();
public Customer getCustomer(final String id);
public List<Customer> getVipCustomer();

public List<Company> getCompanies();
public Customer getCompany(final String id);
public List<Customer> getVipCompanies();

Référé à la présentation " Developing Android REST applications client " de Virgil Dobjanschi, j'ai appris que ce n'était pas une bonne idée de gérer le REST request dans un thread de travail de l'activité. À la place, je devrais utiliser l'API Service .

J'aime l'idée d'avoir un Singleton ServiceHelper qui se lie à un service (local) mais je crains de ne pas avoir compris le concept de service correctement.

Pour l'instant, je ne comprends pas comment signaler un REST résultat d'appel (effectué de manière asynchrone dans un service) à l'activité de l'appelant. Je me demande également si j'ai besoin d'un service qui gère tous les REST requêtes (avec différents types de retour) ou si j'ai besoin d'un service dédié pour chaque REST requête.

J'ai probablement beaucoup d'autres problèmes de compréhension, donc la meilleure chose pour moi serait un exemple d'application qui répond à mes besoins. Mon cas d'utilisation n'est pas inhabituel et j'espère qu'il existe un exemple d'application.

Veuillez me le faire savoir!

Toutes autres suggestions qui me dirigent dans la bonne direction d'implémentation sont également utiles (Android API-Demo ne correspond pas à mon cas d'utilisation).

Merci d'avance.

Klaus

[~ # ~] modifier [~ # ~] : rubriques similaires trouvées sur SO (après avoir publié ceci) qui conduisez-moi dans la direction dont j'ai besoin (en minimisant le "motif Dobjanschi" complexe):

81
FrVaBe

OverView

Modifier:

Quiconque s'intéresse également à jeter un oeil à Android RESTful cela pourrait vous donner un meilleur aperçu.

Ce que j'ai appris de l'expérience en essayant de mettre en œuvre le modèle Dobjanschi, c'est que tout n'est pas écrit dans la pierre et il vous donne seulement un aperçu de ce qui peut changer d'une application à l'autre, mais la formule est la suivante:

Suivez ces idées + Ajoutez la vôtre = Happy Android

Le modèle de certaines applications peut varier de l'exigence, certaines pourraient ne pas avoir besoin du compte pour SyncAdapter, d'autres pourraient utiliser C2DM, celui-ci que j'ai travaillé récemment pourrait aider quelqu'un:


Créer une application avec Account et AccountManager

Il vous permettra d'utiliser le SyncAdapter pour synchroniser vos données. Cela a été discuté sur Créez votre propre SyncAdapter

Créez un ContentProvider (si cela convient à vos besoins)

Cette abstraction vous permet non seulement d'accéder à la base de données, mais va au ServiceHelper pour exécuter REST appels car il a une méthode de mappage un par un avec le REST Cambre.

Fournisseur de contenu | REST Méthode

requête ----------------> OBTENIR

insérer ----------------> PUT

mise à jour ----------------> POST

supprimer ----------------> SUPPRIMER

ServiceHelper Layering

Ce type démarrera simplement un (des) service (s) qui exécutent un Http (pas nécessairement le protocole mais c'est le plus courant) REST avec les paramètres que vous avez passés depuis ContentProvider. J'ai passé l'entier de correspondance obtenu à partir de l'UriMatcher sur le fournisseur de contenu, donc je sais à quelle ressource REST accéder, c'est-à-dire.

class ServiceHelper{

    public static void execute(Context context,int match,String parameters){
//find the service resource (/path/to/remote/service with the match
//start service with parameters 
    }

}

Le service

Obtient exécuté (j'utilise IntentService la plupart du temps) et il va au RESTMethod avec les paramètres passés de l'aide, à quoi sert-il? rappelez-vous bien que le service est bon pour faire fonctionner les choses en arrière-plan.

Implémentez également un BroadCastReceiver donc lorsque le service est terminé avec son travail, informez mon activité qui a enregistré cette diffusion et réinterrogez-la à nouveau. Je crois que cette dernière étape ne fait pas partie de la conférence de Virgill, mais je suis sûr que c'est une bonne façon de procéder.

Classe RESTMethod

Prend les paramètres, la ressource WS ( http://myservice.com/service/path ) ajoute les paramètres, prépare tout, exécute l'appel et enregistre la réponse.

Si l'authtoken est nécessaire, vous pouvez demander au AccountManager Si l'appel du service a échoué en raison de l'authentification, vous pouvez invalider l'authtoken et réauthentifier pour obtenir un nouveau jeton.

Enfin, la RESTMethod me donne soit un XML soit un JSON peu importe que je crée un processeur basé sur le matcher et que je passe la réponse.

Le processeur

Il est chargé d'analyser la réponse et de l'insérer localement.

Un exemple d'application? Bien sûr!

De plus, si vous êtes intéressé par une application de test que vous regardez Eli-G , ce n'est peut-être pas le meilleur exemple mais elle suit l'approche Service REST, elle est construite avec ServiceHelper, Processor, ContentProvider, Loader et Broadcast.

50
Necronet

Programmation Android a un chapitre complet (13. Exploration des fournisseurs de contenu) dédié à 'Option B: Utiliser l'API ContentProvider' de Virgil's Google I/O talk.

Nous ne sommes pas les seuls à voir les avantages de cette approche. Lors de la conférence Google I/O en mai 2010, Virgil Dobjanschi de Google a présenté un exposé décrivant les trois modèles suivants d'utilisation des fournisseurs de contenu pour intégrer les services Web RESTful dans les applications Android Android ...

Dans ce chapitre, nous allons explorer le deuxième motif en détail avec notre deuxième exemple de vidéo Finch; cette stratégie apportera un certain nombre d'avantages importants pour vos applications. En raison de l'élégance avec laquelle cette approche intègre les opérations réseau dans Android MVC, nous lui avons donné le surnom de "Network MVC".

Une future édition de la programmation Android peut aborder les deux autres approches, ainsi que documenter plus de détails sur cette présentation Google. Après avoir fini de lire ce chapitre, nous vous suggérons de consulter la discussion de Google.

Hautement recommandé.

Programmation Android par Zigurd Mednieks, Laird Dornin, G. Blake Meike et Masumi Nakamura. Copyright 2011 O’Reilly Media, Inc., 978-1-449-38969-7.

17
Jeremy Haberman

"Développer Android REST applications clientes" par Virgil Dobjanschi a suscité de nombreuses discussions, car aucun code source n'a été présenté pendant la session ou fourni par la suite).

  • Une implémentation de référence est disponible sous http://datadroid.foxykeep.com (la session Google IO session est mentionnée sous/presentation). C'est une bibliothèque que vous pouvez utiliser dans votre propre application.
  • Android Priority Job Queue a été inspiré par le discours de Dobjanschi et me semble très prometteur.

Veuillez commenter si vous connaissez plus d'implémentations.

11
ChrLipp

Nous avons développé une bibliothèque qui résout ce problème: RoboSpice .

La bibliothèque utilise "l'approche service" décrite par Virgil Dobjanschi et Neil Goodmann , mais nous proposons une solution complète tout-en-un qui:

  • exécute de manière asynchrone (en arrière-plan AndroidService) les requêtes réseau qui renverront des POJO (ex: REST requêtes)
  • met en cache les résultats (dans Json, ou Xml, ou des fichiers texte plats ou des fichiers binaires)
  • informe vos activités (ou tout autre contexte) du résultat de la demande de réseau si elles sont toujours en vie
  • ne notifie pas vos activités du résultat si elles ne sont plus en vie
  • notifie vos activités sur leur thread d'interface utilisateur
  • utilise un modèle de gestion des exceptions simple mais robuste
  • prend en charge plusieurs ContentServices pour agréger différents résultats de services Web
  • prend en charge le multithread des exécutions de demande
  • est fortement tapé!
  • est open source;)
  • et testé

Nous recherchons actuellement des commentaires de la communauté.

7
Snicolas

Retrofit pourrait être très utile ici, il construit un adaptateur pour vous à partir d'une configuration très simple comme:

La modification transforme votre API REST en une interface Java.

public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}

La classe RestAdapter génère une implémentation de l'interface GitHubService.

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

Service GitHubService = restAdapter.create (GitHubService.class); Chaque appel sur le GitHubService généré envoie une requête HTTP au serveur Web distant.

List<Repo> repos = service.listRepos("octocat");

pour plus d'informations, visitez le site officiel: http://square.github.io/retrofit/

Remarque : l'adaptateur RestAdapter que vous obtenez de Retrofit n'est pas dérivé de BaseAdapter vous devriez en faire un wrapper comme ceci SO question Pourquoi mon ListView est-il vide après avoir appelé setListAdapter dans ListFragment?

4
MhdSyrwan

Vous devriez vérifier le code source de l'officiel de Google application I/O 201 , pour les démarreurs, en particulier SyncService et les différentes classes dans le io sous-paquet =.

3
Yoni Samlan

C'est un peu tard mais voici un article qui explique le premier schéma de l'exposé:

http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p

Ce que j'aime dans le premier modèle, c'est que l'interface avec les autres méthodes est une classe ordinaire, et le fournisseur de contenu est laissé à fournir simplement l'accès à la base de données.

3
nzjoel

Bonne nouvelle les gars. Une implémentation de l'assistant de service est disponible ici: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper C'est un projet open source (Apache 2). Je suis au début du projet. J'ai fait un projet où j'ai défini le modèle à faire, mais je n'ai pas encore extrait le code pour faire une librairie propre. Ce sera bientôt fait.

0