Ich möchte einen REST-Client auf einem Android-Handy erstellen.
Der REST-Server stellt mehrere Ressourcen bereit, z. B. (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
Ich (denke) weiß, wie ich mit dem REST-Server sprechen und die Informationen erhalten kann, die ich brauche. Ich würde eine REST-Client-Klasse mit einer API wie dieser implementieren
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();
In Bezug auf die Präsentation " Entwickeln von Android-REST-Clientanwendungen " von Virgil Dobjanschi habe ich erfahren, dass es keine gute Idee ist, die REST-Anforderung in einem Worker-Thread der Aktivität zu bearbeiten. Stattdessen sollte ich die Service- API verwenden.
Ich mag die Idee, einen Singleton ServiceHelper zu haben, der an einen (lokalen) Service gebunden ist, aber ich befürchte, dass ich das Servicekonzept nicht richtig verstanden habe.
Im Moment verstehe ich nicht, wie ein REST-Anrufergebnis (das in einem Dienst asynchron ausgeführt wird) an die Anruferaktivität zurückgemeldet wird. Ich frage mich auch, ob ich EINEN Dienst benötige, der alle REST-Anforderungen (mit unterschiedlichen Rückgabetypen) verarbeitet, oder ob ich für jede REST-Anforderung einen dedizierten Dienst benötige.
Wahrscheinlich habe ich viele andere Verständnisprobleme, daher wäre das Beste für mich eine Beispielanwendung, die meinen Anforderungen entspricht. Mein Anwendungsfall ist nicht ungewöhnlich und ich hoffe, dass es eine Beispielanwendung gibt.
Würdest du es mich bitte wissen lassen?
Alle anderen Vorschläge, die mich in die richtige Implementierungsrichtung weisen, sind ebenfalls hilfreich (Android API-Demo entspricht nicht meinem Anwendungsfall).
Danke im Voraus.
Klaus
EDIT : Ähnliche Themen auf SO (nach dem Posten), die mich in die Richtung führen, die ich brauche (Minimierung des komplexen "Dobjanschi-Musters"):
quelle
Antworten:
Überblick
Bearbeiten:
Jeder, der Interesse hat, sollte sich auch RESTful android ansehen. Dies könnte Ihnen einen besseren Einblick geben.
Was ich aus den Erfahrungen beim Versuch, das Dobjanschi-Modell zu implementieren, gelernt habe, ist, dass nicht alles in Stein gemeißelt ist und er Ihnen nur einen Überblick darüber gibt, was zu tun ist. Dies könnte sich von App zu App ändern, aber die Formel lautet:
Folgen Sie diesen Ideen + Fügen Sie Ihre eigene = Happy Android-Anwendung hinzu
Das Modell einiger Apps kann von den Anforderungen abweichen. Einige benötigen möglicherweise nicht das Konto für den SyncAdapter. Andere verwenden möglicherweise C2DM. Dieses, an dem ich kürzlich gearbeitet habe, kann jemandem helfen:
Erstellen Sie eine Anwendung mit Account und AccountManager
Damit können Sie den SyncAdapter verwenden, um Ihre Daten zu synchronisieren. Dies wurde unter Erstellen eines eigenen SyncAdapters erläutert
Erstellen Sie einen ContentProvider (falls er Ihren Anforderungen entspricht).
Mit dieser Abstraktion können Sie nicht nur auf die Datenbank zugreifen, sondern auch zum ServiceHelper gehen, um REST-Aufrufe auszuführen, da dieser über eine Eins-zu-Eins-Zuordnungsmethode mit dem REST-Bogen verfügt.
Inhaltsanbieter | REST-Methode
Abfrage ----------------> GET
Einfügen ----------------> PUT
Update ----------------> POST
löschen ----------------> LÖSCHEN
ServiceHelper Layering
Dieser Typ startet grundsätzlich (a) Dienste, die eine HTTP-REST-Methode (nicht unbedingt das Protokoll, aber die häufigste) ausführen, mit den Parametern, die Sie vom ContentProvider übergeben haben. Ich habe die Match-Ganzzahl, die vom UriMatcher auf dem Inhaltsanbieter abgerufen wurde, übergeben, damit ich weiß, auf welche REST-Ressource zugegriffen werden soll, d. H.
Der Service
Wird ausgeführt (ich benutze IntentService die meiste Zeit) und es geht zur RESTMethod mit den vom Helfer übergebenen Parametern. Wofür ist es gut? Denken Sie daran, dass Service gut ist, um Dinge im Hintergrund auszuführen.
Implementieren Sie auch einen BroadCastReceiver. Wenn der Dienst mit seiner Arbeit fertig ist, benachrichtigen Sie meine Aktivität, die diesen Broadcast und diese Anforderung erneut registriert hat. Ich glaube, dieser letzte Schritt ist nicht auf der Virgill-Konferenz, aber ich bin mir ziemlich sicher, dass dies ein guter Weg ist.
RESTMethod-Klasse
Übernimmt die Parameter, fügt die WS-Ressource ( http://myservice.com/service/path ) die Parameter hinzu, bereitet alles vor, führt den Aufruf aus und speichert die Antwort.
Wenn das Authtoken benötigt wird, können Sie es vom AccountManager anfordern. Wenn der Aufruf des Dienstes aufgrund der Authentifizierung fehlgeschlagen ist, können Sie das Authtoken und die Reauth ungültig machen, um ein neues Token zu erhalten.
Schließlich gibt mir die RESTMethod entweder XML oder JSON, unabhängig davon, ob ich einen Prozessor basierend auf dem Matcher erstelle und die Antwort übergebe.
Der Prozessor
Es ist dafür verantwortlich, die Antwort zu analysieren und lokal einzufügen.
Eine Beispielanwendung? Natürlich!
Auch wenn Sie an einer Testanwendung interessiert sind, die Sie sich für Eli-G ansehen , ist sie möglicherweise nicht das beste Beispiel, folgt jedoch dem Service REST-Ansatz. Sie basiert auf ServiceHelper, Processor, ContentProvider, Loader und Broadcast.
quelle
Programmieren von Android enthält ein vollständiges Kapitel (13. Erkunden von Inhaltsanbietern) zu 'Option B: Verwenden der ContentProvider-API' aus Virgils Google I / O-Vortrag.
Sehr empfehlenswert.
Programmieren von Android von Zigurd Mednieks, Laird Dornin, G. Blake Meike und Masumi Nakamura. Copyright 2011 O'Reilly Media, Inc., 978-1-449-38969-7.
quelle
"Entwickeln von Android REST-Client-Anwendungen" von Virgil Dobjanschi führte zu vielen Diskussionen, da während der Sitzung kein Quellcode präsentiert oder danach bereitgestellt wurde.
Bitte kommentieren Sie, wenn Sie weitere Implementierungen kennen.
quelle
Wir haben eine Bibliothek entwickelt, die dieses Problem behebt : RoboSpice .
Die Bibliothek verwendet den von Virgil Dobjanschi und Neil Goodmann beschriebenen "Service-Ansatz". Wir bieten jedoch eine Komplettlösung, die:
Wir suchen tatsächlich nach Feedback von der Community.
quelle
Eine Nachrüstung kann hier sehr hilfreich sein. Sie erstellt einen Adapter für Sie aus einer sehr einfachen Konfiguration wie:
Retrofit verwandelt Ihre REST-API in eine Java-Schnittstelle.
Die RestAdapter-Klasse generiert eine Implementierung der GitHubService-Schnittstelle.
GitHubService service = restAdapter.create (GitHubService.class); Bei jedem Aufruf des generierten GitHubService wird eine HTTP-Anforderung an den Remote-Webserver gesendet.
Weitere Informationen finden Sie auf der offiziellen Website: http://square.github.io/retrofit/
Hinweis : Der Adapter, den
RestAdapter
Sie von Retrofit erhalten, ist nicht vonBaseAdapter
Ihnen abgeleitet. Sie sollten einen Wrapper dafür erstellen, wie diese SO-Frage erstellen, Warum ist meine ListView leer, nachdem Sie setListAdapter in ListFragment aufgerufen haben?quelle
Dies ist etwas spät, aber hier ist ein Artikel, der das erste Muster aus dem Vortrag erklärt:
http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p
Das erste Muster gefällt mir, dass die Schnittstelle zu den übrigen Methoden eine einfache Klasse ist und der Inhaltsanbieter einfach den Zugriff auf die Datenbank gewähren muss.
quelle
Sie sollten zunächst den Quellcode für die offizielle I / O 2010-App von Google lesen , insbesondere den SyncService und die verschiedenen Klassen im io-Unterpaket .
quelle
Gute Nachrichten Jungs. Eine Implementierung des Service-Helfers finden Sie hier: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper Es handelt sich um ein Open Source-Projekt (Apache 2). Ich bin am Anfang des Projekts. Ich habe ein Projekt durchgeführt, in dem ich das Muster definiert habe, aber ich habe den Code noch nicht extrahiert, um eine saubere Bibliothek zu erstellen. Es wird bald fertig sein.
quelle