Networking api in android

Android Networking в 2019 — Retrofit с Kotlin Coroutines

Mar 18, 2019 · 5 min read

В 2018 году произошли серьезные изменения мира Android, особенно касательно Android Networking. Многие перешли от использования RxJava к Kotlin Coroutines, для обработки многопоточности в Android.

Поговорим о том, как выполнить вызов Android Networking API с помощью Retrofit2 и Kotlin Coroutines, и сделаем сетевой вызов API TMDB для получения популярных фильмов.

Вкратце об Android Networking

В сущности, android networking, как и любой другой networking, работает следующим образом:

  • Request — Выполнение HTTP-запроса к URL-адресу (конечной точке — endpoint) с соответствующими заголовками. При необходимости используется ключ авторизации.
  • Response — Запрос возвращает ответ, содержащий error или success. В случае успешного завершения запроса, ответ содержит содержимое endpoint (обычно в формате JSON)
  • Parse & Store — Парсинг JSON, получение необходимых значений и размещение их в классе данных.

В Android используются:

  • Okhttp — Для создания HTTP-запроса с соответствующими заголовками.
  • Retrofit — Для создания запроса
  • Moshi / GSON — Для парсинга данных JSON
  • Kotlin Coroutines — Для создания сетевых запросов, не блокирующих основной поток.
  • Picasso / Glide —Для скачивания и установки изображения в ImageView.

Начнем

В API TMDb (The Movie Database) находится список всех популярных, недавно вышедших, а также готовящихся к выпуску фильмов и сериалов. Это один из самых популярных API для различных экспериментов.

Для со з дания запросов в API TMDB требуется ключ API. Для этого нужно:

Скрытие ключа API в Version Control (Не обязательное, но рекомендуемое действие)

После получения ключа API выполните следующие действия, чтобы скрыть его в VCS.

  • Добавьте ключ в local.properties, находящийся в корневой папке (root folder).
  • Получите доступ к ключу в build.gradle с помощью программы.
  • Ключ будет доступен в программе через BuildConfig.

Установка проекта

Для установки проекта добавляем необходимые зависимости в build.gradle (Module: app):

Создание сервиса TmdbAPI

Рассмотрим наши действия в ApiFactory.kt.

  • Сначала создаем Network Interceptor, чтобы добавить api_key во все запросы в качестве authInterceptor.
  • Затем создаем сетевого клиента с помощью OkHttp и добавляем authInterceptor.
  • Теперь соединяем все вместе, чтобы создать строителя (builder) и обработчика (handler) HTTP-запроса с помощью Retrofit. Здесь добавляем ранее созданного сетевого клиента, базовый URL, а также конвертер и адаптер.
    MoshiConverter участвует в парсинге JSON и конвертирует ответ JSON в класс данных Kotlin, при необходимости используя селективный парсинг.
    CoroutineCallAdaptor — это CallAdapter.Factory Retrofit2 для значения Deferred Kotlin coroutine.
  • Наконец создаем tmdbApi, передав ссылку на класс TmdbApi (Создание с следующем пункте) к ранее созданному классу retrofit.

Поиск по API Tmdb

Получаем следующий ответ для endpoint /movie/popular. Ответ возвращает результаты — массив объекта movie. Именно он нам и нужен.

Читайте также:  Zoyoskii android 10 дюймов

Теперь создаем класс данных Movie и класс MovieResponse в соответствии с json.

После создания класса данных, мы создаем интерфейс TmdbApi. Ссылка на него находится в строителе retrofit. В интерфейс TmdbApi добавляем требуемые вызовы API и при необходимости параметры запроса. К примеру, чтобы получить фильм по id нужно добавить следующий метод в интерфейс:

Выполнение сетевого вызова

Для получения необходимых данных выполняем сетевой вызов в DataRepository или в ViewModel или прямо в Activity.

Sealed Result Class

Класс, который используется для обработки ответа сети. Он может иметь значение Success с необходимыми данными или Error с исключением.

Построение BaseRepository для обработки safeApiCall

Построение MovieRepository

Создание View Model для получения данных

Использование ViewModel в Activity для обновления UI

Мы рассмотрели базовый полнофункциональный вызов API для Android. Больше примеров вы найдете здесь.

Источник

Android для начинающих: использование REST API

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Большинство из нас стали весьма жадны до новой информации, что в Интернете является такой важной частью нашей жизни. Поэтому создание приложений Android со статичным контентом может быть плохой идеей. Вместо этого вам следует рассмотреть возможность создания приложений, которые могут отображать свежий контент каждый раз, когда пользователь их открывает.

Это может звучать сложно, но с большим количеством сайтов, которые раскрывают свои ресурсы через REST API, на самом деле это довольно просто. (Смотрите руководство для начинающих по HTTP и REST для примера.)

В этом уроке я расскажу вам, как использовать классы и методы, доступные в Android SDK, для подключения к удаленным веб-серверам и взаимодействия с ними с использованием их REST API.

1. Включение доступа к Интернету

Использование REST API, очевидно, связано с использованием Интернета. Тем не менее, приложения Android могут получить доступ к Интернету только в том случае, если у них есть разрешение android.permission.INTERNET . Поэтому перед началом написания любого сетевого кода вы должны убедиться, что в файле манифеста вашего проекта присутствуют следующие uses-permission теги:

Поскольку android.permission.INTERNET не считается опасным разрешением, вам не нужно запрашивать его во время выполнения на устройствах с уровнем API 23 или выше.

2. Создание фоновых потоков

Платформа Android не позволяет выполнять сетевые операции в основном потоке приложения. Поэтому весь ваш сетевой код должен принадлежать фоновому потоку. Самый простой способ создать такой поток — использовать метод execute() класса AsyncTask . В качестве единственного аргумента execute() ожидает объект Runnable .

Если вы хотите узнать больше о выполнении операций в фоновом потоке, я предлагаю вам прочитать этот учебник о фоновых операциях из серии Android для начинающих.

3. Создание HTTP-соединения

Используя метод openConnection() класса URL , вы можете быстро настроить соединение с любой конечной точкой REST. Возвращаемое значение openConnection() должно быть передано в экземпляр HttpURLConnection или HttpsURLConnection , в зависимости от доступа к конечной точке через HTTP или HTTPS. Оба HttpURLConnection и HttpsURLConnection позволяют выполнять такие операции, как добавление заголовков запросов и чтение ответов.

В следующем фрагменте кода показано, как настроить соединение с корневой конечной точкой API GitHub:

Обратите внимание, что HttpsURLConnection является подклассом класса HttpURLConnection .

4. Добавление заголовков запросов

Большинство веб-сайтов, предлагающих REST API, хотят иметь возможность однозначно идентифицировать ваше приложение. Самый простой способ помочь им сделать это — включить уникальный заголовок User-Agent во все ваши запросы.

Читайте также:  Эксплорер для android tv

Чтобы добавить заголовок User-Agent в ваш запрос, вы должны использовать метод setRequestProperty() объекта HttpURLConnection . Например, вот как вы устанавливаете заголовок User-Agent в my-rest-app-v0.1:

Вы можете добавить несколько заголовков к своему запросу, вызвав несколько раз метод setRequestProperty() . Например, следующий фрагмент кода добавляет заголовок Accept и кастомный заголовок Contact-Me :

5. Чтение ответов

После того как вы передали все заголовки запросов, вы можете проверить, есть ли у вас валидный ответ, используя метод getResponseCode() объекта HttpURLConnection .

Если класс HttpURLConnection получает код ответа на перенаправление, например 301, он автоматически обрабатывает его и следует за перенаправлением. Поэтому, как правило, вам не нужно будет писать дополнительный код для проверки перенаправления.

В случае отсутствия ошибок вы можете теперь вызвать метод getInputStream() , чтобы получить ссылку на входящий поток соединения.

Большинство REST API в наши дни возвращают данные, отформатированные как документы JSON. Поэтому, вместо прямого чтения из объекта InputStream , я предлагаю вам создать для него InputStreamReader .

6. Разбор JSON ответов

Android SDK имеет класс JsonReader, который позволяет легко разбирать документы JSON. Вы можете создать новый экземпляр класса JsonReader , передав объект InputStreamReader его конструктору.

То как вы извлекаете определенную часть информации из документа JSON, зависит от его структуры. Например, документ JSON, возвращаемый корневой конечной точкой REST API GitHub, выглядит следующим образом:

Как вы можете видеть, ответ — это только один большой объект JSON, содержащий несколько ключей. Чтобы извлечь из него значение с именем organization_url, вам нужно будет написать следующий код:

Вышеупомянутый код обрабатывает ответ JSON как поток токенов. Поэтому он потребляет очень мало памяти. Однако, поскольку он должен обрабатывать каждый отдельный токен один за другим, он может оказаться медленным при обработке больших ответов.

После того как вы извлечете всю необходимую информацию, вы всегда должны вызвать метод close() для объекта JsonReader , чтобы он освобождал все сохраненные ресурсы.

Вы также должны закрыть соединение, вызвав метод disconnect() объекта HttpURLConnection .

7. Использование разных HTTP методов

HTTP-интерфейсы REST используют методы HTTP для определения типа операции, которая должна выполняться над ресурсом. На предыдущих шагах мы использовали метод HTTP GET для выполнения операции чтения. Поскольку класс HttpURLConnection использует по умолчанию метод GET , нам не нужно было его явно указывать.

Чтобы изменить метод HTTP вашего объекта HttpURLConnection , вы должны использовать его метод setRequestMethod() . Например, следующий фрагмент кода открывает соединение с конечной точкой, принадлежащей httpbin.org, и устанавливает свой HTTP-метод в POST :

Как вы уже знаете, POST -запросы используются для отправки данных на сервер. При записи в выходной поток соединения вы можете легко добавить любые данные в тело запроса POST . Однако, прежде чем вы это сделаете, вы должны убедиться, что вы вызываете метод setDoOutput() объекта HttpURLConnection и передаете ему значение true .

В следующем фрагменте кода показано, как отправить на сервер простую пару «ключ-значение»:

8. Кэширование ответов

Всегда рекомендуется кэшировать ответы HTTP. Таким образом, вы можете не только сократить потребление пропускной способности вашего приложения, но и сделать его более отзывчивым. Начиная с уровня API 13, Android SDK предлагает класс HttpResponseCache , который позволяет легко реализовать кэширование без каких-либо изменений в вашей сетевой логике.

Чтобы установить кэш для вашего приложения, вы должны вызвать метод install() класса HttpResponseCache . Метод ожидает абсолютный путь, указывающий, где должен быть установлен кеш, и число, определяющее размер кеша. Вы можете использовать метод getCacheDir() , если вы не хотите указывать абсолютный путь вручную.

Читайте также:  Андроид usb накопитель что это

В следующем фрагменте кода устанавливается кеш размером 100 000 байт:

Как только кеш установлен, класс HttpURLConnection начинает использовать его автоматически. Чтобы проверить, работает ли ваш кеш, вы можете использовать его метод getHitCount() , который возвращает количество HTTP-ответов, которые были отправлены из кеша.

Заключение

Существуют тысячи REST API-интерфейсов, которые вы можете свободно использовать в своих приложениях для Android. Используя их, вы можете сделать ваше приложение более информативным, интересным и многофункциональным. В этом уроке вы узнали, как использовать класс HttpURLConnection для использования таких REST API. Вы также узнали, как создать кеш ответов HTTP, который снижает использование потребление сетевого трафика вашим приложением.

Если вы считаете, что использование HttpURLConnection слишком сложное, вам следует обратить внимание на сторонние библиотеки, такие как например, Volley. Библиотеки, подобные этой, используют класс HttpURLConnection внутри, но предоставляют множество удобных методов, которые позволяют сделать ваш код более кратким и читаемым.

Чтобы узнать больше о работе с сетью на платформе Android, вы можете обратиться к руководству по сетевым операциям Android.

Источник

Android Networking — Tutorial

Performing HTTP operations with Android. This article describes how to access web resources via HTTP in Android.

1. Overview of network access on Android

1.1. Accessing the network in Android

Within an Android application you should avoid performing long running operations on the user interface thread. This includes file and network access.

The Android system crashes your application with a NetworkOnMainThreadException exception, if you access network is accessed from the main thread.

Android contains the standard Java network java.net package which can be used to access network resources. The base class for HTTP network access in the java.net package is the HttpURLConnection class.

Performing network operations with standard Java API can be cumbersome. You have to open and close a connections, enable caches and ensure to perform the network operation in a background thread.

To simplify these operations several popular Open Source libraries are available. The most popular ones are the following:

OkHttp for efficient HTTP access

Retrofit for REST based clients

Glide for image processing

Prefer using OkHttp over the usage of HttpURLConnection . It is faster than the standard Java library and has a better API.

1.2. Permission to access the network

To access the Internet your application requires the android.permission.INTERNET permission. On modern Android API versions, this permission is automatically granted to your application.

1.3. Check the network availability

The network on an Android device is not always available. To check the network state your application requires the android.permission.ACCESS_NETWORK_STATE permission. You can check the network is currently available via the following code.

This requires the ACCESS_NETWORK_STATE permission.

2. Web Sockets

Web Sockets are a standard based on HTTP for asynchronous message-based communication between a client and a server. To start a web socket communication, you create a HTTP GET request with a special HTTP headers. If the server accepts this request, the client and the server can send each other messages.

Messages can be text or binary data and should be relatively small, as the web socket protocol is intended to be used with small payloads in the data.

It is good practice to use JSON as data format for the messages.

Источник

Оцените статью