Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Android od podstaw: korzystanie z REST API

Difficulty:BeginnerLength:MediumLanguages:
This post is part of a series called Android From Scratch.
Android From Scratch: Hardware Sensors

Polish (Polski) translation by Mateusz Kurlit (you can also view the original English article)

Dzięki Internetowi, który jest tak ważną częścią naszego życia, większość z nas nabrało ogromnego apetytu na nowe informacje. Nasza koncentracja uwagi jest słabsza niż kiedykolwiek, dlatego tworzenie aplikacji zawierających statyczną treść to zdecydowanie zły pomysł. Zamiast tego, warto pisać aplikacje, które wyświetlają nowy kontent po każdym otworzeniu ich przez użytkownika.

Na pierwszy rzut oka to może wydawać się trudne, ale z powodu rosnącej liczby stron internetowych prezentujących swoje zasoby za pomocą REST API, wcale takie nie jest. (Zobacz nasz przewodnik dla początkujących na temat HTTP i REST)

W tym poradniku, pokażę ci jak wykorzystać klasy i metody dostępne w Android SDK, aby łączyć się ze zdalnymi serwerami sieciowymi i wchodzić z nimi w interakcję za pomocą REST API.

1. Włączanie dostępu do Internetu

Posługiwanie się REST API wiąże się z połączeniem internetowym. Aplikacje na Androida mogą uzyskać dostęp do Internetu, gdy otrzymają uprawnienie android.permission.INTERNET. W związku z tym, przed rozpoczęciem pracy z kodem, musisz umieścić poniższy tag uses-permission w pliku manifestu projektu:

Ponieważ android.permission.INTERNET nie jest niebezpiecznym uprawnieniem, nie musisz o nie prosić podczas uruchamiania aplikacji na urządzeniach z API 23 lub wyższym.

2. Tworzenie wątków w tle

Platforma Android nie zezwala na działanie operacji sieciowych w wątku głównym aplikacji. W związku z tym, cały kod sieciowy musi należeć do wątku tła. Najłatwiejszym sposobem na jego stworzenie jest użycie metody execute() klasy AsyncTask. Jako jedynego argumentu, execute() oczekuje obiektu Runnable.

Jeśli chcesz uzyskać więcej informacji na temat uruchamiania operacji w wątkach tła, polecam zapoznanie się z poradnikiem na temat operacji w tle z serii Android od podstaw.

3. Ustanawianie połączenia HTTP

Korzystając z metody openConnection() klasy URL możesz błyskawicznie ustanowić połączenie z dowolnym punktem końcowym REST. Wartość zwrotna openConnection() musi być przekazana instancji HttpURLConnection lub HttpsURLConnection, w zależności od tego czy punkt końcowy korzysta z HTTP czy HTTPS. HttpURLConnection i HttpsURLConnection umożliwiają przeprowadzanie operacji, takich jak dodawanie żądań nagłówków i odczytywanie odpowiedzi.

Poniższy fragment kodu pokazuje jak połączyć się z punktem końcowym GitHub API:

Zwróć uwagę, że HttpsURLConnection jest podklasą klasy HttpURLConnection.

4. Dodawanie żądań nagłówków

Większość stron internetowych oferujących REST API chce jednoznacznie identyfikować twoją aplikację. Aby im to ułatwić wystarczy dołączyć unikalny nagłówek User-Agent we wszystkich żądaniach.

Aby dodać nagłówek User-Agent do żądania, musisz użyć metody setRequestProperty() obiektu HttpURLConnection. Dla przykładu, oto jak ustawić nagłówek User-Agent na my-rest-app-v0.1:

Możesz dodać wiele nagłówków do żądania wywołując metodę setRequestProperty() wielokrotnie. Na przykład, poniższy fragment kodu dodaje nagłówek Accept i niestandardowy Contact-Me.

5. Odczytywanie odpowiedzi

Po przekazaniu wszystkich żądań nagłówków za pomocą metody getResponseCode() obiektu HttpURLConnection,  możesz sprawdzić czy otrzymujesz prawidłową odpowiedź.

Jeżeli klasa HttpURLConnection otrzymuje kod odpowiedzi 301, automatycznie go obsługuje i wykonuje przekierowanie. Z tego powodu, zazwyczaj nie będziesz musiał pisać dodatkowego kodu sprawdzającego przekierowania.

W przypadku braku błędów, możesz wywołać metodę getInputStream, aby uzyskać odniesienie do strumienia wejściowego połączenia.

Dzisiaj większość REST API zwaracają dane sformatowane jako dokumenty JSON. Zamiast odczytywania bezpośrednio z obiektu InputStream, proponuję stworzyć InputStreamReader.

6. Analiza odpowiedzi JSON

Android SDK posiada klasę o nazwie JsonReader, która ułatwia analizowanie dokumentów JSON. Możesz stworzyć nową instancję klasy JsonReader przekazując obiekt InputStreamReader do jej konstruktora.

Metoda wyodrębniania określonego fragmentu informacji z dokumentu JSON zależy od jego struktury. Dla przykładu, dokument JSON zwrócony przez punkt końcowy REST API GituHub wygląda tak:

Jak widzisz, odpowiedź jest jednym wielkim obiektem JSON, który zawiera kilka kluczy. Aby wyodrębnić z niego wartość klucza o nazwie organization_url, musisz napisać taki kod:

Powyższy kod przetwarza odpowiedź JSON na strumień tokenów. W związku z tym, zajmuje bardzo mało pamięci. Jednakże, może być powolny podczas obsługiwania złożonych odpowiedzi, ponieważ musi przetworzyć każdy token jeden po drugim.

Po wyodrębnieniu wszystkich wymaganych informacji, musisz zawsze wywołać metodę close() obiektu JsonReader w celu uwolnienia wszystkich posiadanych przez niego zasobów.

Należy również zamknąć połączenie wywołując metodę disconnect() obiektu HttpURLConnection.

7. Korzystanie z różnych metod HTTP

Interfejsy REST bazujące na HTTP korzystają z metod do określania typu operacji, która ma być przeprowadzona na zasobie.  W poprzednich krokach, użyliśmy metody GET HTTP, aby przeprowadzić operację odczytywania. Nie musimy sprecyzować metody GET, poniewaz klasa HttpURLConnection domyślnie z niej korzysta.

Aby zmienić metodę HTTP obiektu HttpURLConnection, musisz użyć jego metody setRequestMethod(). Dla przykładu, poniższy fragment kodu otwiera połączenia z punktem końcowym, który należy do httpbin.org, i ustawia jego metodę HTTP na POST:

Prawdopodobnie już wiesz, że żądania POST są wykorzystywane do wysyłania danych do serwera. Zapisując do wyjściowego strumienia połączenia, możesz z łatwością dodać dowolne dane do żądania POST. Zanim to zrobisz, musisz wywołać metodę setDoOutput() obiektu HttpURLConnection i przekazać jej wartość true.

Poniższy fragment kodu pokazuje jak wysłać prostą parę klucz-wartość do serwera.

8. Buforowanie odpowiedzi

Zawsze warto buforować odpowiedzi HTTP. Robiąc to, nie tylko redukujesz wykorzystanie łącza przez twoją aplikację, ale również zwiększasz jej wydajność. Od API 13, Android SDK posiada klasę o nazwie HttpResponseCache, która pozwala na łatwe zaimplementowanie buforowania bez konieczności wprowadzania zmian w logice sieciowej.

Aby zainstalować pamięć podręczną w twojej aplikacji, musisz wywołać metodę install() klasy HttpResponseCache. Metoda oczekuje ścieżki uwzględniającej miejsce instalacji pamięci podręcznej oraz liczbę określającą jej rozmiar. Możesz użyć metody getCacheDir(), jeśli nie chcesz wskazywać ścieżki ręcznie.

Poniższy fragment kodu instaluje pamięć podręczną o rozmiarze 100,000 bajtów:

Po zainstalowaniu pamięci podręcznej, klasa HttpURLConnection automatycznie zacznie jej używac. Aby sprawdzić poprawność instalacji, możesz użyć jej metody getHitCount(), która zwraca liczbę odpowiedzi HTTP, które były z niej podawane z pamięci podręcznej.

Podsumowanie

Istnieje tysiące REST API dostępnych do swobodnego wykorzystania w aplikacjach na Androida. Korzystając z nich, możesz sprawić, że twoja aplikacja będzie bardziej czytelna, interesująca i bogata w funkcje. W tym poradniku, nauczyłeś się jak wykorzystać klasę HttpURLConnection do obsługiwania REST API. Dowiedziałeś się również jak zainstalować pamięć podręczną odpowiedzi HTTP, która obniża zużycie łącza przez aplikację.

Jeżeli używanie HttpURLConnection jest trudne, powinieneś wypróbować jedną z bibliotek firm trzecich Volley. Korzystają one z klas HttpURLConnection wewnętrznie, ale dostarczają wiele wygodnych metod, które pozwalają na pisanie bardziej zwięzłego i czytelnego kodu.

Aby uzyskać więcej informacji o łączności sieciowej na platformie Android, polecam przejrzeć przewodnik po operacjach sieciowych dla systemu Android.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.