2011-05-23 8 views
5

Próbuję wdrożyć aplikację, aby korzystać z usługi internetowej RESTful. Przeanalizowałem kilka różnych przykładów i zakodowałem dobrą, działającą aplikację, która skutecznie odciąga się od usługi REST. Ale teraz potrzebuję jakiegoś kierunku. Oto podstawowe tło (bardzo uproszczone) ...Android i usługa RESTful

  • Załóż podstawową usługę REST, która ma metody "GetReferrers" i "AddReferrer".
  • Od Activity nazywam managedQuery, aby uzyskać Cursor z powrotem z dla mojego ListView.
  • The ContentProvider zwraca z powrotem wszelkie dane lokalne i wywołuje asynchroniczne "GetReferrers", aby uzyskać najnowszą listę serwerów odsyłających.
  • Mam niestandardowy ResponseHandler do parsowania JSON i wstawić go do ContentProvider.
  • Na razie usuwam wszystkie rekordy w lokalnym ContentProvider po pomyślnym "pobraniu" z serwera, a następnie wstawieniu nowej/zaktualizowanej listy do bazy danych.

dwa pytania, jakie są ...

  1. Kiedy zrobić nową GET, byłoby to powszechną praktyką, aby usunąć wszystkie istniejące rekordy w lokalnej ContentProvider i wstawić nową listę? A może lepiej (aczkolwiek bardziej czasochłonnie) sprawdzać nowe/zmienione/usunięte rekordy, aby tylko odpowiednio dodawać/zmieniać/usuwać?

  2. Naprawdę nie mam pojęcia, od czego zacząć od "dodania" od klienta, aby wykorzystać metodę REST "AddReferrer". Wiem, jak dodać nowy element lokalnie do ContentProvider przy użyciu ContentValues z getContentResolver().insert(). Ale gdzie powinienem umieścić kod, żeby przekazać to na serwer? A może częstszą praktyką byłoby pomijanie dodawania do lokalnego urządzenia lokacyjnego ContentProvider, wypychanie go na serwer, a następnie pozwolić GET odciągnąć go z powrotem na lokalny numer ContentProvider?

Mam nadzieję, że wszystko ma sens. Byłbym wdzięczny za każdy kierunek, jaki możesz dać. Jeśli ktoś wie o dobrym dwukierunkowym przykładzie, proszę podziel się. Wszystkie przykłady operacji klienta REST, które do tej pory znalazłem, po prostu wykonują "pobieranie" z serwera i nie wypisują kopii zapasowej.

+0

dla # 2, najpierw przesłać dane do usługi REST, a po pomyślnej odpowiedzi wstawić lokalnie. – binnyb

+0

Myślę, że to jest to, na co się skłaniam w związku z # 2. – robertmiles3

+0

@ robertmiles3 Mam nadzieję, że udało ci się to przejść. Może możesz mi pomóc w tym [podobnym setupie] (http://stackoverflow.com/questions/11906172/synchronize-android-client-and-rest-server). – JJD

Odpowiedz

2
  1. Gdy miałem zrobić coś takiego kiedyś mogłaby wdrożyć metodę REST jak getReferrersSince(timestamp), który dał mi tylko zmiany od ostatniej synchronizacji. Ale jeśli usługa nie jest pod Twoją kontrolą, sugerowałbym również pierwszą opcję. Sprawdzanie każdego wpisu pod względem zmian prawdopodobnie trwa tak długo, jak usunięcie i ponowne wstawienie wszystkich, ale jest znacznie bardziej prawdopodobne, że będzie niespójne.
    btw: Daniele Teti ma rację. Tak było rzeczywiście coś
    GET http://.../referrers?since=[timestamp]

  2. Wystarczy upewnić: Czy oglądanie Virgil Dobjanschi? Sugeruje, aby najpierw wstawić elementy lokalnie i zaznaczyć je jako "oczekujące" w dodatkowej kolumnie bazy danych (np. SYNC_STATUS). Następnie skorzystaj z usługi, która przesyła wszystkie oczekujące produkty za pośrednictwem usługi REST w tle i zaznacza je jako "zsynchronizowane".

+0

Nie jestem pewien, czy mogę iść z metodą Virgila. Jeśli wstawię nowy "odsyłający" i nie został on jeszcze zsynchronizowany, wtedy spróbuję użyć tego wywoływacza w innej metodzie posta, która zawiodłaby. Odsyłający musi zostać pomyślnie wypchnięty, zanim będę mógł go użyć gdzie indziej. – robertmiles3

+0

Prawda. Musisz być ostrożny w kolejności, w której chcesz się zsynchronizować. Ale możesz już odnieść się do lokalnego wpisu lokalnie. W ten sposób nie musisz czekać na odpowiedź serwera na użytkownika, który byłby brakiem reakcji. Przyznaję jednak, że nie jest to trywialne i powinieneś lepiej się nad tym zastanowić;) – jederik

0

To tylko moja opinia, ale na pytanie nr 1 polecam po prostu usunięcie bieżących rekordów w DB, a następnie ponowne wstawienie ich po udanym połączeniu internetowym. Z późniejszą sugestią, będziesz musiał utworzyć funkcję do przechodzenia przez wszystkie bieżące wartości w DB, zobacz czy pasują do nowej kolekcji (zakładam, że masz jakiś klucz podstawowy do połączenia), a następnie zaktualizuj/usuń/dodaj wartości do bazy danych, które mogą być licznymi wywołaniami do bazy danych, chyba że utworzysz ogólną instrukcję aktualizacji, w której dynamicznie tworzysz klauzulę "SET/WHERE" jako ciąg, a następnie uruchom kwerendę raz.

Tak czy inaczej, z punktu widzenia efektywności, uruchamianie tylko kwerendy usuwania i wstawiania w porównaniu ze złożoną funkcją dopasowującą oraz wiele zapytań o aktualizację/dodawanie/usuwanie wydaje się być najlepszym sposobem na przejście, ponownie moim zdaniem.

Na pytania nr 2, trzeba zbudować XML w kodzie, a następnie dodawać je jak te przykłady:

Android Post Example

Another Example

Lub może po prostu przekazać swoje wartości za pośrednictwem Ciąg URL, a następnie pozwól serwerowi wyodrębnić te wartości.

Na przykład:

http://www.example.com/MyWebService.asmx/AddReferrer?variable1=foo&variable2=bar&variable1=foo2&variable2=bar2

W tym przykładzie mam zakładając serwer jest serwerem .net. W .net mogę zasadniczo utworzyć tablicę wszystkich wartości dla variable1, a następnie przepuścić przez nie i dodać na przykład serwer po stronie DB.

[WebMethod] 
public string AddReferrer(string[] variable1, string[] variable2) 
{ 

Mam nadzieję, że to pomogło!

+0

Dzięki. Myślę, że zgadzamy się na # 1. O wiele szybciej i łatwiej jest po prostu usunąć istniejące rekordy i ponownie je wstawić. Jeśli chodzi o # 2, interfejs API REST, z którym rozmawiam, wymaga obiektu JSON w żądaniu. To nie problem, tylko FYI, że to nie jest .NET. Im więcej o tym myślę, tym bardziej zastanawiam się, czy powinienem po prostu wykonać asynchroniczne wywołanie do wpisu REST, a następnie zmusić ContentProvider do odświeżenia swojego "get", aby pobrać nowy rekord, aby lokalna pamięć była aktualizowana. Jestem również otwarty na wszelkie myśli. – robertmiles3

+0

Czy istnieje sposób modyfikowania 'AddRefferer', aby zwrócić odpowiedź podobną do' GetRefferer'? Czy te metody internetowe są usługami stron trzecich, których nie można zmodyfikować? ..ponieważ jeśli można uzyskać 'AddReferrer' do wysłania odpowiedzi, która jest identyczna z metodą" get ", wyeliminowałoby to potrzebę posiadania dwóch asynchronicznych wywołań internetowych, które na urządzeniach mobilnych byłyby lepsze, ponieważ może być wielu użytkowników, którzy mogą mieć słabe połączenia sieciowe. – AngeloS

+0

Również tutaj znajduje się link do posta json: [android post json] (http://localtone.blogspot.com/2009/07/post-json-using-android-and-httpclient.html) – AngeloS

-1

W nazwach metod nie powinno się mieć czasowników. W systemie RESTful "akcja" jest niejawna w czasowniku żądania http. AddReferrer powinien nazywać się "referrers" i powinien być wywoływany za pomocą metody PUT http. Sprawdź następujący artykuł http://www.infoq.com/articles/rest-introduction

+0

Uzgodniono, i nie mają czasowników w swoich metodach. Powyższe nazwy metod nie są prawdziwe i służyły wyłącznie wyjaśnieniu tego, czego szukam. Całkowicie przegapiłeś ten punkt. – robertmiles3