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):
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:
Il vous permettra d'utiliser le SyncAdapter pour synchroniser vos données. Cela a été discuté sur Créez votre propre SyncAdapter
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
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
}
}
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.
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.
Il est chargé d'analyser la réponse et de l'insérer localement.
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.
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.
"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).
Veuillez commenter si vous connaissez plus d'implémentations.
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:
Nous recherchons actuellement des commentaires de la communauté.
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?
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 =.
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.
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.