Auch wenn dieser Thread die Antwort akzeptiert hat, können Sie gerne andere Ideen vorschlagen, die Sie verwenden oder mögen
Ich habe diese Artikel getroffen:
Und das führte mich zu diesem Google I / O 2010-Video über REST-Clientanwendungen
Seitdem erstelle ich eine REST-Komponente als statische Komponente in meiner Application Controller-Klasse.
Von jetzt an denke ich, ich sollte das Muster ändern. Jemand wies darauf hin, dass die Google IOSched- Anwendung ein großartiges Beispiel für das Schreiben von REST-Clients auf Android ist. Jemand anderes hat gesagt, dass dieser Weg zu kompliziert ist.
Kann uns bitte jemand zeigen, was die beste Vorgehensweise ist? Kurz und einfach.
Die IOSched-Anwendung ist für einen Beispielanwendungsfall zu komplex.
Antworten:
EDIT 2 (Oktober 2017):
Es ist 2017. Verwenden Sie einfach Retrofit. Es gibt fast keinen Grund, etwas anderes zu verwenden.
BEARBEITEN:
Die ursprüngliche Antwort ist zum Zeitpunkt dieser Bearbeitung mehr als anderthalb Jahre alt. Obwohl die in der ursprünglichen Antwort vorgestellten Konzepte immer noch gelten, wie andere Antworten zeigen, gibt es jetzt Bibliotheken, die Ihnen diese Aufgabe erleichtern. Noch wichtiger ist, dass einige dieser Bibliotheken Änderungen an der Gerätekonfiguration für Sie übernehmen.
Die ursprüngliche Antwort wird unten als Referenz aufbewahrt. Nehmen Sie sich aber auch die Zeit, einige der Rest-Client-Bibliotheken für Android zu untersuchen, um festzustellen, ob sie zu Ihren Anwendungsfällen passen. Das Folgende ist eine Liste einiger der Bibliotheken, die ich evaluiert habe. Es ist keineswegs als vollständige Liste gedacht.
Ursprüngliche Antwort:
Ich präsentiere meinen Ansatz, REST-Clients auf Android zu haben. Ich behaupte jedoch nicht, dass es das Beste ist :) Beachten Sie auch, dass ich mir dies als Antwort auf meine Anforderung ausgedacht habe. Möglicherweise müssen Sie mehr Ebenen haben / mehr Komplexität hinzufügen, wenn Ihr Anwendungsfall dies erfordert. Zum Beispiel habe ich überhaupt keinen lokalen Speicher; weil meine App den Verlust einiger REST-Antworten tolerieren kann.
Mein Ansatz verwendet nur
AsyncTask
s unter der Decke. In meinem Fall "rufe" ich diese Aufgaben von meinerActivity
Instanz aus auf; Um Fälle wie die Bildschirmrotation vollständig zu berücksichtigen, können Sie sie auch von einemService
oder einem anderen aus aufrufen .Ich habe meinen REST-Client selbst bewusst als API ausgewählt. Dies bedeutet, dass die App, die meinen REST-Client verwendet, nicht einmal die tatsächlichen REST-URLs und das verwendete Datenformat kennen muss.
Der Client hätte 2 Schichten:
Oberste Ebene: Der Zweck dieser Ebene besteht darin, Methoden bereitzustellen, die die Funktionalität der REST-API widerspiegeln. Beispielsweise könnten Sie eine Java-Methode haben, die jeder URL in Ihrer REST-API entspricht (oder sogar zwei - eine für GETs und eine für POSTs).
Dies ist der Einstiegspunkt in die REST-Client-API. Dies ist die Ebene, die die App normalerweise verwenden würde. Es könnte ein Singleton sein, aber nicht unbedingt.
Die Antwort des REST-Aufrufs wird von dieser Ebene in ein POJO analysiert und an die App zurückgegeben.
Dies ist die untergeordnete Ebene
AsyncTask
, die HTTP-Client-Methoden verwendet, um diesen REST-Aufruf tatsächlich auszuführen.Außerdem habe ich mich für einen Rückrufmechanismus entschieden, um das Ergebnis des
AsyncTask
s wieder an die App zu übermitteln .Genug von Text. Sehen wir uns jetzt einen Code an. Nehmen wir eine hypothetische REST-API-URL - http://myhypotheticalapi.com/user/profile
Die oberste Ebene könnte folgendermaßen aussehen:
Beachten Sie, dass die App nicht JSON oder XML (oder ein anderes Format) verwendet, das von der REST-API direkt zurückgegeben wird. Stattdessen sieht die App nur die Bean
Profile
.Dann könnte die untere Ebene (AsyncTask-Ebene) folgendermaßen aussehen:
So kann eine App die API verwenden (in einem
Activity
oderService
):Ich hoffe, die Kommentare reichen aus, um das Design zu erklären. aber ich würde gerne mehr Infos zur Verfügung stellen.
quelle
GetResponseCallback
generischer zu machen . Ich bevorzuge die Verwendung einer Markierungsschnittstelle :interface IGetResopnse{}
Bezeichne gerne alle Klassen, die Antworten sein könnten. Dann, ich habeclass Profile implements IGetResponse
usw. Schließlich machtGetResponseCallback
generischIGetResponse
als die obere Grenze :public abstract class GetResponseCallback<? extends IGetResponse>
."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.
Die einzige mir bekannte Referenzimplementierung (bitte kommentieren Sie, wenn Sie mehr wissen) ist bei Datadroid verfügbar (die Google IO-Sitzung wird unter / Präsentation erwähnt). Es ist eine Bibliothek, die Sie in Ihrer eigenen Anwendung verwenden können.
Der zweite Link fragt nach dem "besten" REST-Framework, das im Stackoverflow ausführlich diskutiert wird. Für mich ist die Anwendungsgröße wichtig, gefolgt von der Leistung der Implementierung.
Deshalb halte ich mich für komplexere Szenarien an org.json oder GSON. Für die Architektur einer org.json-Implementierung verwende ich eine statische Klasse, die die Anwendungsfälle des Servers darstellt (z. B. findPerson, getPerson). Ich rufe diese Funktionalität von einem Dienst auf und verwende Dienstprogrammklassen, die das Mapping (projektspezifisch) und die Netzwerk-E / A (meine eigene REST-Vorlage für einfaches GET oder POST) ausführen. Ich versuche, die Verwendung von Reflexion zu vermeiden.
quelle
Verwenden Sie niemals AsynTask, um Netzwerkanforderungen auszuführen oder was auch immer beibehalten werden muss. Async-Aufgaben sind stark an Ihre Aktivität gebunden. Wenn der Benutzer die Ausrichtung des Bildschirms ändert, seit die App neu erstellt wurde, wird die AsyncTask gestoppt.
Ich empfehle Ihnen, das Dienstmuster mit Intent Service und ResultReceiver zu verwenden. Schauen Sie sich RESTDroid an . Es ist eine Bibliothek, mit der Sie jede Art von REST-Anforderung asynchron ausführen und Ihre Benutzeroberfläche mit Anforderungslistenern benachrichtigen können, die das Dienstmuster von Virgil Dobjanschi implementieren.
quelle
Es gibt eine weitere Bibliothek mit einer viel saubereren API und typsicheren Daten. https://github.com/kodart/Httpzoid
Hier ist ein einfaches Anwendungsbeispiel
Oder komplexer mit Rückrufen
Es ist frisch neu, sieht aber sehr vielversprechend aus.
quelle
Es gibt viele Bibliotheken und ich benutze diese: https://github.com/nerde/rest-resource . Dies wurde von mir erstellt und ist, wie Sie in der Dokumentation sehen können, viel sauberer und einfacher als die anderen. Es ist nicht auf Android fokussiert, aber ich benutze es und es funktioniert ziemlich gut.
Es unterstützt HTTP Basic Auth. Es erledigt den schmutzigen Job des Serialisierens und Deserialisierens von JSON-Objekten. Sie werden es mögen, besonders wenn Ihre API Rails-ähnlich ist.
quelle
Haftungsausschluss: Ich bin am Open Source-Projekt rest2mobile beteiligt
Eine andere Alternative als REST-Client ist die Verwendung von rest2mobile .
Der Ansatz unterscheidet sich geringfügig, da konkrete Restbeispiele zum Generieren des Clientcodes für den REST-Service verwendet werden. Der Code ersetzt die REST-URL- und JSON-Nutzdaten durch native Java-Methoden und POJOs. Außerdem werden Serververbindungen, asynchrone Aufrufe und POJO-zu / von JSON-Konvertierungen automatisch verarbeitet.
Beachten Sie, dass dieses Tool in verschiedenen Geschmacksrichtungen (cli, Plugins, android / ios / js - Unterstützung) und Sie können die Verwendung Android Studio Plugin die API direkt in Ihre Anwendung zu generieren.
Den gesamten Code finden Sie hier auf github .
quelle
Wir haben unsere leichtgewichtige asynchrone REST-Client-Bibliothek für Android als Open-Source-Version bereitgestellt. Sie finden sie möglicherweise nützlich, wenn Sie nur minimale Anforderungen haben und das Multithreading nicht selbst ausführen möchten. Für die grundlegende Kommunikation ist dies sehr in Ordnung, aber kein vollständiger REST-Client Bibliothek.
Es heißt libRESTfulClient und ist auf GitHub zu finden .
quelle