Nawet jeśli ten wątek zaakceptował odpowiedź, możesz zaproponować inne pomysły, których używasz lub lubisz
Poznałem te artykuły:
To doprowadziło mnie do tego filmu Google I / O 2010 o aplikacjach klienckich REST
Od tej pory tworzę komponent REST jako komponent statyczny w mojej klasie kontrolera aplikacji.
Myślę, że od teraz powinienem zmienić wzór. Ktoś zwrócił uwagę, że aplikacja Google IOSched to świetny przykład tego, jak pisać klientów REST na Androida. Ktoś inny powiedział, że ten sposób jest zbyt skomplikowany.
Czy ktoś może nam pokazać, jakie są najlepsze praktyki? Krótko i prosto.
Aplikacja IOSched jest zbyt złożona dla przykładowego przypadku użycia.
Odpowiedzi:
EDYCJA 2 (październik 2017):
Jest rok 2017. Po prostu użyj Retrofit. Nie ma prawie żadnego powodu, aby używać czegokolwiek innego.
EDYTOWAĆ:
Oryginalna odpowiedź ma ponad półtora roku w momencie tej edycji. Chociaż koncepcje przedstawione w pierwotnej odpowiedzi nadal są aktualne, jak wskazują inne odpowiedzi, istnieją obecnie biblioteki, które ułatwiają ci to zadanie. Co ważniejsze, niektóre z tych bibliotek obsługują zmiany konfiguracji urządzeń za Ciebie.
Oryginalna odpowiedź została zachowana poniżej w celach informacyjnych. Ale proszę również poświęcić trochę czasu na sprawdzenie niektórych bibliotek klienta Rest dla Androida, aby sprawdzić, czy pasują do twoich przypadków użycia. Poniżej znajduje się lista niektórych bibliotek, które oceniłem. W żadnym wypadku nie jest to lista wyczerpująca.
Oryginalna odpowiedź:
Przedstawiam moje podejście do posiadania klientów REST na Androida. Nie twierdzę jednak, że jest najlepszy :) Zwróć też uwagę, że to właśnie wymyśliłem w odpowiedzi na moje wymagania. Być może będziesz potrzebować więcej warstw / dodać więcej złożoności, jeśli wymaga tego Twój przypadek użycia. Na przykład w ogóle nie mam lokalnego magazynu; ponieważ moja aplikacja może tolerować utratę kilku odpowiedzi REST.
W moim podejściu używa się tylko
AsyncTask
znaków pod kołdrą. W moim przypadku „wywołuję” te zadania z mojejActivity
instancji; ale aby w pełni uwzględnić przypadki takie jak obrót ekranu, możesz zadzwonić do nich z poziomu aService
lub innego .Świadomie wybrałem samego klienta REST na API. Oznacza to, że aplikacja korzystająca z mojego klienta REST nie musi nawet znać rzeczywistych adresów URL REST i używanego formatu danych.
Klient miałby 2 warstwy:
Warstwa wierzchnia: celem tej warstwy jest zapewnienie metod odzwierciedlających funkcjonalność REST API. Na przykład, możesz mieć jedną metodę Java odpowiadającą każdemu adresowi URL w Twoim REST API (lub nawet dwie - jedną dla GET i jedną dla POST).
To jest punkt wejścia do interfejsu API klienta REST. Jest to warstwa, z której aplikacja normalnie korzysta. Może to być singleton, ale niekoniecznie.
Odpowiedź na wywołanie REST jest analizowana przez tę warstwę w POJO i zwracana do aplikacji.
Jest to
AsyncTask
warstwa niższego poziomu , która używa metod klienta HTTP, aby faktycznie wyjść i wykonać to wywołanie REST.Ponadto zdecydowałem się użyć mechanizmu wywołania zwrotnego, aby przekazać wynik operacji z
AsyncTask
powrotem do aplikacji.Dość tekstu. Zobaczmy teraz kod. Weźmy hipotetyczny adres URL REST API - http://myhypotheticalapi.com/user/profile
Górna warstwa może wyglądać tak:
Należy pamiętać, że aplikacja nie używa formatu JSON ani XML (ani żadnego innego formatu) zwracanego bezpośrednio przez interfejs API REST. Zamiast tego aplikacja widzi tylko ziarno
Profile
.Wtedy dolna warstwa (warstwa AsyncTask) może wyglądać następująco:
Oto jak aplikacja może korzystać z interfejsu API (w
Activity
lubService
):Mam nadzieję, że komentarze są wystarczające, aby wyjaśnić projekt; ale z przyjemnością udzielę więcej informacji.
źródło
GetResponseCallback
bardziej ogólnych. Preferuję użycie interfejsu znaczników : Lubięinterface IGetResopnse{}
oznaczać wszystkie klasy, które mogą być odpowiedziami. Następnie mamclass Profile implements IGetResponse
itd. Wreszcie zrobićGetResponseCallback
rodzajowe zIGetResponse
jako górna granica :public abstract class GetResponseCallback<? extends IGetResponse>
.„Tworzenie aplikacji klienckich Android REST” autorstwa Virgila Dobjanschiego wywołało wiele dyskusji, ponieważ podczas sesji nie przedstawiono żadnego kodu źródłowego ani nie dostarczono go później.
Jedyna implementacja referencyjna, jaką znam (jeśli wiesz więcej, proszę o komentarz) jest dostępna w Datadroid (sesja Google IO jest wymieniona w / prezentacja). Jest to biblioteka, z której możesz korzystać we własnej aplikacji.
Drugie łącze prosi o „najlepszą” strukturę REST, która jest intensywnie omawiana na temat przepływu stosu. Dla mnie ważny jest rozmiar aplikacji, a następnie wydajność wdrożenia.
Dlatego trzymam się org.json lub GSON dla bardziej złożonych scenariuszy. W przypadku architektury implementacji org.json używam klasy statycznej, która reprezentuje przypadki użycia serwera (np. FindPerson, getPerson). Nazywam tę funkcjonalność z usługi i używam klas narzędzi, które wykonują mapowanie (specyficzne dla projektu) i sieciowe IO (mój własny szablon REST dla zwykłego GET lub POST). Staram się unikać refleksji.
źródło
Nigdy nie używaj AsynTask do wykonywania żądań sieciowych lub czegokolwiek, co wymaga utrwalenia. Async Task jest silnie powiązany z Twoją aktywnością i jeśli użytkownik zmieni orientację ekranu od momentu ponownego utworzenia aplikacji, AsyncTask zostanie zatrzymany.
Proponuję użyć wzorca usługi z usługą zamiaru i odbiornikiem wyników. Spójrz na RESTDroid . Jest to biblioteka, która pozwala na asynchroniczne wykonywanie dowolnego rodzaju żądań REST i powiadamianie interfejsu użytkownika za pomocą detektorów żądań implementujących wzorzec usług Virgila Dobjanschiego.
źródło
Istnieje inna biblioteka ze znacznie czystszym interfejsem API i bezpiecznymi danymi. https://github.com/kodart/Httpzoid
Oto prosty przykład użycia
Lub bardziej złożone z oddzwonieniami
Jest świeży, ale wygląda bardzo obiecująco.
źródło
Istnieje wiele bibliotek i używam tej: https://github.com/nerde/rest-resource . Ten został stworzony przeze mnie i, jak widać w dokumentacji, jest o wiele czystszy i prostszy niż inne. Nie koncentruje się na Androidzie, ale używam go i działa całkiem dobrze.
Obsługuje HTTP Basic Auth. Wykonuje brudną robotę serializacji i deserializacji obiektów JSON. Spodoba ci się to, szczególnie jeśli twoje API jest podobne do Railsów.
źródło
Zastrzeżenie: Jestem zaangażowany w projekt open source rest2mobile
Inną alternatywą jako klienta REST jest użycie rest2mobile .
Podejście jest nieco inne, ponieważ wykorzystuje konkretne przykłady reszt do generowania kodu klienta dla usługi REST. Kod zastępuje REST URL i ładunki JSON natywnymi metodami Java i POJO. Obsługuje również automatycznie połączenia z serwerem, wywołania asynchroniczne i konwersje POJO do / z JSON.
Zwróć uwagę, że to narzędzie jest dostępne w różnych wersjach (CLI, wtyczki, obsługa systemu Android / ios / js) i możesz użyć wtyczki Android Studio do wygenerowania interfejsu API bezpośrednio w swojej aplikacji.
Cały kod można znaleźć na github tutaj .
źródło
Udostępniliśmy naszą lekką asynchroniczną bibliotekę klienta REST dla systemu Android o otwartym kodzie źródłowym, może się przydać, jeśli masz minimalne wymagania i nie chcesz samodzielnie zajmować się wielowątkowością - jest to bardzo OK w przypadku podstawowej komunikacji, ale nie jest pełnym klientem REST biblioteka.
Nazywa się libRESTfulClient i można go znaleźć na GitHub .
źródło