Chcę zbudować klienta REST na telefonie z Androidem.
Serwer REST udostępnia kilka zasobów, np. (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
Myślę, że wiem, jak rozmawiać z serwerem REST i uzyskać potrzebne informacje. Zaimplementowałbym klasę klienta REST z takim API
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();
Odnosząc się do prezentacji „ Tworzenie aplikacji klienckich REST dla systemu Android ” autorstwa Virgila Dobjanschiego, dowiedziałem się, że obsługa żądania REST w wątku roboczym działania nie jest dobrym pomysłem. Zamiast tego powinienem użyć Service API.
Podoba mi się pomysł posiadania Singleton ServiceHelper, który wiąże się z (lokalną) usługą, ale obawiam się, że nie rozumiem poprawnie koncepcji usługi.
Na razie nie rozumiem, jak zgłosić wynik wywołania REST (wykonany asynchronicznie w usłudze) z powrotem do aktywności dzwoniącego. Zastanawiam się również, czy potrzebuję JEDNEJ usługi, która obsługuje wszystkie żądania REST (z różnymi typami zwrotów), czy też potrzebuję dedykowanej usługi dla każdego żądania REST.
Prawdopodobnie mam wiele innych problemów ze zrozumieniem, więc najlepszą rzeczą dla mnie byłaby przykładowa aplikacja, która spełnia moje potrzeby. Mój przypadek użycia nie jest niezwykły i mam nadzieję, że istnieje przykładowa aplikacja.
Czy mógłbyś dać mi znać!
Wszelkie inne sugestie, które wskazują mi właściwy kierunek implementacji, są również pomocne (Android API-Demo nie pasuje do mojego przypadku użycia).
Z góry dziękuję.
Klaus
EDYCJA : Podobne tematy znalezione w SO (po opublikowaniu tego), które prowadzą mnie w pożądanym kierunku (minimalizując złożony „wzór Dobjanschi”):
źródło
Odpowiedzi:
Przegląd
Edytować:
Każdy zainteresowany również rozważ przyjrzenie się RESTful android, co może dać ci lepszy obraz.
Z doświadczenia przy wdrażaniu modelu Dobjanschiego dowiedziałem się, że nie wszystko jest napisane w kamieniu, a on daje tylko przegląd tego, co należy zrobić, może się zmienić z aplikacji na aplikację, ale formuła jest taka:
Postępuj zgodnie z tymi pomysłami + Dodaj własną aplikację = Happy Android
Model w niektórych aplikacjach może się różnić od wymagań, niektóre mogą nie potrzebować konta dla SyncAdapter, inne mogą używać C2DM, ten, nad którym ostatnio pracowałem, może komuś pomóc:
Utwórz aplikację, która ma Account i AccountManager
Umożliwi to użycie SyncAdapter do synchronizacji danych. Zostało to omówione w temacie Utwórz własny SyncAdapter
Utwórz ContentProvider (jeśli odpowiada Twoim potrzebom)
Ta abstrakcja umożliwia nie tylko dostęp do bazy danych, ale także przechodzi do ServiceHelpera w celu wykonania wywołań REST, ponieważ ma metodę mapowania jeden na jeden z Arch REST.
Dostawca treści | Metoda REST
zapytanie ----------------> GET
wstaw ----------------> PUT
aktualizacja ----------------> POST
usuń ----------------> USUŃ
ServiceHelper Layering
Ten facet po prostu uruchomi (a) usługę (y), które wykonują metodę REST (niekoniecznie protokół, ale jest to najbardziej powszechna) z parametrami przekazanymi z ContentProvider. Przekazałem dopasowaną liczbę całkowitą, która jest pobierana z UriMatchera w dostawcy treści, więc wiem, do którego zasobu REST mam dostęp, tj.
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 } }
Obsługa
Zostaje wykonany (przez większość czasu używam IntentService) i przechodzi do metody RESTMethod z parametrami przekazanymi przez helpera, do czego to jest dobre? pamiętaj, że Serwis dobrze działa w tle.
Zaimplementuj także BroadCastReceiver, aby po zakończeniu usługi powiadomić moją aktywność, która zarejestrowała tę transmisję i ponownie poprosić. Wierzę, że ten ostatni krok nie jest na konferencji Virgill, ale jestem pewien, że jest to dobry sposób.
Klasa RESTMethod
Pobiera parametry, zasób WS ( http://myservice.com/service/path ) dodaje parametry, przygotowuje wszystko, wykonuje wywołanie i zapisuje odpowiedź.
Jeśli potrzebny jest authtoken, możesz zażądać od AccountManager. Jeśli wywołanie usługi nie powiodło się z powodu uwierzytelnienia, możesz unieważnić authtoken i ponownie uwierzytelnić, aby uzyskać nowy token.
Wreszcie metoda RESTMethod daje mi XML lub JSON bez względu na to, czy utworzę procesor oparty na dopasowywaniu i przekażę odpowiedź.
Procesor
Odpowiada za analizowanie odpowiedzi i wstawianie jej lokalnie.
Przykładowa aplikacja? Oczywiście!
Również jeśli interesuje Cię aplikacja testowa, którą patrzysz na Eli-G , może nie być najlepszym przykładem, ale jest ona zgodna z podejściem Service REST, jest zbudowana przy użyciu ServiceHelper, Processor, ContentProvider, Loader i Broadcast.
źródło
Programowanie Android ma pełny rozdział (13. Exploring Content Providers) poświęcony „Opcji B: Use the ContentProvider API” z omówienia Google I / O firmy Virgil.
Wysoce rekomendowane.
Programowanie na Androida przez Zigurda Mednieksa, Lairda Dornina, G. Blake'a Meike'a i Masumi Nakamurę. Copyright 2011 O'Reilly Media, Inc., 978-1-449-38969-7.
źródło
„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.
Prosimy o komentarz, jeśli znasz więcej implementacji.
źródło
Opracowaliśmy bibliotekę, która zajmuje się tym problemem: RoboSpice .
Biblioteka korzysta z „podejścia usługowego” opisanego przez Virgila Dobjanschiego i Neila Goodmanna , ale oferujemy kompletne rozwiązanie typu „wszystko w jednym”, które:
Szukamy opinii od społeczności.
źródło
Retrofit może być tutaj bardzo pomocny, buduje adapter z bardzo prostej konfiguracji, takiej jak:
Modernizacja zamienia Twój REST API w interfejs Java.
public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); }
Klasa RestAdapter generuje implementację interfejsu GitHubService.
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build();
GitHubService service = restAdapter.create (GitHubService.class); Każde wywołanie wygenerowanej usługi GitHubService wysyła żądanie HTTP do zdalnego serwera WWW.
List<Repo> repos = service.listRepos("octocat");
aby uzyskać więcej informacji, odwiedź oficjalną stronę: http://square.github.io/retrofit/
Uwaga : adapter,
RestAdapter
który otrzymujesz z Retrofit, nie jest pochodną tegoBaseAdapter
, powinieneś utworzyć dla niego opakowanie w taki sposób, jak to pytanie SO Dlaczego mój ListView jest pusty po wywołaniu setListAdapter wewnątrz ListFragment?źródło
To trochę za późno, ale oto artykuł, który wyjaśnia pierwszy wzorzec z wykładu:
http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p
To, co mi się podoba w pierwszym wzorcu, to fakt, że interfejs do pozostałych metod jest zwykłą klasą, a dostawca treści ma po prostu zapewnić dostęp do bazy danych.
źródło
Na początek powinieneś sprawdzić kod źródłowy oficjalnej aplikacji Google I / O 2010 , w szczególności SyncService i różne klasy w podpakiecie io .
źródło
Dobre wieści. Implementacja pomocnika usługi jest dostępna tutaj: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper To projekt open source (Apache 2). Jestem na początku projektu. Zrobiłem projekt, w którym zdefiniowałem wzorzec do wykonania, ale nie wyodrębniłem jeszcze kodu, aby stworzyć czystą bibliotekę. Wkrótce to nastąpi.
źródło