Okhttp3 android что это

Руководство по OkHttp

1. Введение

В этой статье мы покажем основы отправки различных типов HTTP-запросов, получения и интерпретации HTTP-ответов и того , как настроить клиента с помощью OkHttp.

Кроме того, мы рассмотрим более сложные варианты использования настройки клиента с использованием настраиваемых заголовков, тайм-аутов, кеширования ответов и т. Д.

2. Обзор OkHttp

OkHttp — это эффективный клиент HTTP и HTTP / 2 для приложений Android и Java.

Он поставляется с расширенными функциями, такими как пул соединений (если HTTP / 2 недоступен), прозрачное сжатие GZIP и кеширование ответов, чтобы полностью исключить сеть для повторных запросов.

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

На высоком уровне клиент предназначен как для блокировки синхронных, так и для неблокируемых асинхронных вызовов.

OkHttp поддерживает Android 2.3 и выше. Для Java минимальное требование — 1,7.

После этого краткого обзора давайте рассмотрим несколько примеров использования.

3. Зависимость от Maven

Давайте сначала добавим библиотеку в качестве зависимости в pom.xml :

Чтобы увидеть последнюю зависимость этой библиотеки, посетите страницу в Maven Central.

4. Синхронный GET с OkHttp

Чтобы отправить синхронный запрос GET, нам нужно создать объект запроса на основе URL-адреса и выполнить вызов . После его выполнения мы возвращаем экземпляр Response :

5. Асинхронный GET с OkHttp

Теперь, чтобы сделать асинхронный GET, нам нужно поставить в очередь вызов . Обратный вызов позволяет прочитать ответ , когда он читается. Это происходит после того, как заголовки ответа готовы.

Чтение тела ответа все еще может блокироваться. OkHttp в настоящее время не предлагает никаких асинхронных API для получения тела ответа по частям:

6. GET с параметрами запроса

Наконец, чтобы добавить параметры запроса к нашему GET-запросу, мы можем воспользоваться HttpUrl.Builder .

После создания URL-адреса мы можем передать его нашему объекту Request :

7. Запрос POST

Давайте посмотрим на простой запрос POST, в котором мы создаем RequestBody для отправки параметров «имя пользователя» и «пароль» :

В нашей статье Краткое руководство по отправке запросов с OkHttp есть больше примеров запросов POST с OkHttp.

8. Загрузка файла

8.1. Загрузить файл

В этом примере мы увидим, как загрузить файл . Мы загрузим файл test.ext с помощью MultipartBody.Builder :

8.2. Получить прогресс загрузки файла

Наконец, давайте посмотрим, как узнать о ходе загрузки файла . Мы расширим RequestBody, чтобы видеть процесс загрузки.

Во-первых, вот метод загрузки:

Вот интерфейс ProgressListener, который позволяет нам наблюдать за процессом загрузки:

Вот ProgressRequestWrapper, расширенная версия RequestBody :

Наконец, вот CountingSink, который является расширенной версией Forwarding Sink :

Обратите внимание, что:

  • При расширении ForwardingSink до «CountingSink» мы переопределяем метод write () для подсчета записанных (переданных) байтов.
  • При расширении RequestBody до « ProgressRequestWrapper » мы переопределяем метод writeTo () для использования нашего «ForwardingSink»

9. Установка собственного заголовка

9.1. Setting a Header on a Request

To set any custom header on a Request we can use a simple addHeader call:

Читайте также:  Платформа android зарядка устройства через usb нажмите для настройки usb подключения

9.2. Setting a Default Header

In this example, we will see how to configure a default header on the Client itself, instead of setting it on each and every request.

For example, if we want to set a content type “application/json” for every request we need to set an interceptor for our client. Here is the method:

And here is the DefaultContentTypeInterceptor which is the extended version of Interceptor:

Note that the interceptor adds the header to the original request.

10. Do Not Follow Redirects

In this example, we’ll see how to configure the OkHttpClient to stop following redirects.

By default, if a GET request is answered with an HTTP 301 Moved Permanently the redirect is automatically followed. In some use cases, that may be perfectly fine, but there are certainly use cases where that’s not desired.

To achieve this behavior, when we build our client, we need to set followRedirects to false.

Note that the response will return an HTTP 301 status code:

If we turn on the redirect with a true parameter (or remove it completely), the client will follow the redirection and the test will fail as the return code will be an HTTP 200.

11. Timeouts

Use timeouts to fail a call when its peer is unreachable. Network failures can be due to client connectivity problems, server availability problems, or anything between. OkHttp supports connect, read, and write timeouts.

In this example, we built our client with a readTimeout of 1 seconds, while the URL is served with 2 seconds of delay:

Note as the test will fail as the client timeout is lower than the resource response time.

12. Canceling a Call

Use Call.cancel() to stop an ongoing call immediately. If a thread is currently writing a request or reading a response, an IOException will be thrown.

Use this to conserve the network when a call is no longer necessary; for example when your user navigates away from an application:

13. Response Caching

To create a Cache, we’ll need a cache directory that we can read and write to, and a limit on the cache’s size.

The client will use it to cache the response:

After launching the test, the response from the first call will not have been cached. A call to the method cacheResponse will return null, while a call to the method networkResponse will return the response from the network.

Also, the cache folder will be filled with the cache files.

The second call execution will produce the opposite effect, as the response will have already been cached. This means that a call to networkResponse will return null while a call to cacheResponse will return the response from the cache.

To prevent a response from using the cache, use CacheControl.FORCE_NETWORK. To prevent it from using the network, use CacheControl.FORCE_CACHE.

Be warned: if you use FORCE_CACHE and the response requires the network, OkHttp will return a 504 Unsatisfiable Request response.

Читайте также:  Как ставить свои обои для андроид

14. Conclusion

In this article, we have seen several examples of how to use OkHttp as an HTTP & HTTP/2 client.

Как всегда, пример кода можно найти в проекте GitHub.

Источник

Какую библиотеку работы с HTTP в Android выбрать?

Представляю вашему вниманию перевод статьи «Which Android HTTP library to use?».

Для чего это вообще?

Немного истории

До Froyo HttpURLConnection имел некоторые не очень приятные баги. В частности, вызов close() у читаемого InputStream мог испортить пул соединений.

… большой размер их API мешает нам улучшать эту библиотеку без потери обратной совместимости. Команда Android не работает активно над Apache HTTP Client.

Apache HTTP client имеет мало багов на Eclair и Froyo, поэтому он является лучшим выбором для этих версий. А для Gingerbread и младше лучше подходит HttpURLConnection. Простота API и небольшой вес хорошо подходят для Android. Прозрачное сжатие и кэширование ответов помогают увеличить скорость и сохранить батарею. Новые приложения должны использовать HttpURLConnection.

Даже сегодня, если вы загляните в исходники Volley от Google (о ней я расскажу чуть попозже), вы сможете найти такое наследие:

Это классический пример фрагментации Android, которая заставляет страдать разработчиков. В 2013 году Square обратила внимание на эту проблему, когда выпускала OkHttp. OkHttp была создана для прямой работы с верхним уровнем сокетов Java, при этом не используя какие-либо дополнительные зависимости. Она поставляется в виде JAR-файла, так что разработчики могут использовать ее на любых устройствах с JVM (куда мы включаем, конечно, и Android). Для упрощения перехода на их библиотеку, Square имплементировали OkHttp используя интерфейсы HttpUrlConnection и Apache client.

OkHttp получила большое распространение и поддержку сообществом, и, в конце-концов, Google решили использовать версию 1.5 в Android 4.4 (KitKat). В июле 2015 Google официально признала AndroidHttpClient, основанный на Apache, устаревшим, вместе с выходом Android 5.1 (Lolipop).

Сегодня OkHttp поставляется со следующим огромным набором функций:

  1. Поддержка HTTP/2 и SPDY позволяет всем запросам, идущим к одному хосту, делиться сокетом
  2. Объединение запросов уменьшает время ожидания (если SPDY не доступен)
  3. Прозрачный GZIP позволяет уменьшить вес загружаемой информации
  4. Кэширование ответов позволяет избежать работу с сетью при повторных запросах.
  5. Поддержка как и синхронизированных блокирующих вызовов, так и асинхронных вызовов с обратным вызовом (callback)

Моя самая любимая часть OkHttp – как красиво и аккуратно можно работать с асинхронными запросами:

Это очень удобно, так как работа с сетью не должна быть в UI потоке. По-факту, начиная с Android 3.0 (Honeycomb, API 11), работа с сетью в отдельном потоке стала обязательной. Для того, чтобы воплотить что-то похожее с HtttpUrlConnection, вам потребуется построить большую (а может и монструозную) конструкцию с использованием AsyncTask или отдельного потока. Это будет еще более сложным, если вы захотите добавить отмену загрузки, объединение соединений и т.п.

Кстати, не осталась у обочины и HTTP библиотека от Google под названием Volley, которая предоставляет нам следующие бонусы:

  1. Автоматическое планирование сетевых запросов
  2. Множество параллельных сетевых соединений
  3. Прозрачное кэширование в памяти и на диске, в соответствии со стандартной кэш-согласованностью.
  4. Поддержка приоритизации запросов.
  5. Отмена API запросов. Вы можете отменить как один запрос, так и целый блок.
  6. Простота настройки, например, для повторов и отсрочек.
  7. Строгая очередность, которая делает легким корректное заполнение данными, полученными асинхронно из сети, интерфейса пользователя.
  8. Инструменты отладки и трассировки
Читайте также:  Mate in one для андроид

Все, что ни есть в Volley, находится на вершине HttpUrlConnection. Если вы хотите получить JSON или изображение, то Volley имеет на это специальный абстракции, такие как ImageRequest и JsonObjectRequest, которые помогают вам в автоматическом режиме конвертировать полезную нагрузку HTTP. Так же достойно внимания то, что Volley использует жестко запрограммированный размер сетевого пула:

Когда OkHttp использует поток для каждого вызова с ThreadPoolExecutor с максимальным значением Integer.MAX_VALUE:

В результате, в большинстве случаев OkHttp будет действовать быстрее за счет использования бОльшего количества потоков. Если по каким-то причинам вы захотите использовать OkHttp вместе Volley, то есть реализация HttpStack, которая использует API запросов/ответов из OkHttp заместо HttpURLConnection.

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

  1. Retrofit – типобезопасный HTTP Android клиент для взаимодействия с REST-интерфейсами
  2. Picasso – мощная библиотека для загрузки и кэширования изображений под Android

Retrofit предоставляет некий мост между Java кодом и REST-интерфейсом. Он позволяет быстро включить в ваш проект HTTP API интерфейсы, и генерирует самодокументирующуюся реализацию.

В дополнение ко всему, Retrofit поддерживает конвертацию в JSON, XML, протокол буферов (protocol buffers).

Picasso, с другой стороны, предоставляет HTTP библиотеку, ориентированную на работу с изображениями. Например, вы можете загрузить изображение в свой View с помощью одной строчки:

Picasso и Retrofi настроены так, чтобы использовать OkHttpClient как стандартный HTTP клиент. Однако, если хотите, вы можете указать клиентом HttpURLConnection.

Glide – что-то похожее на Picasso. Он предоставляет некоторые дополнительные функции, такие как GIF-анимация, генерация миниатюрных эскизов изображения и неподвижные видео. Полное сравнение можно найти здесь.

Facebook недавно открыли общественности исходный код библиотеки Fresco, которую они используют в своем мобильном приложении. Одна из ключевых функций, которая выделяет ее, — кастомная стратегия выделения памяти для bitmap’ов, чтобы избежать работы долгого GC (сборщик мусора). Fresco выделяет память в регионе, который называется ashmem. Используются некие трюки, чтобы иметь доступ к этому региону памяти доступ как из части, написанной на C++, так и из части на Java. Чтобы уменьшить потребление CPU и данных из сети, эта библиотека использует 3 уровня кэша: 2 в ОЗУ, третий во внутреннем хранилище.

Я нашел необходимым показать отношения между библиотеками на одной схеме. Как вы можете увидеть, HTTP всегда остается внизу у высокоуровневых библиотек. Вы можете выбирать между простым HttpUrlConnection или последним OkHttpClient. Мы используем эту совместимость при разработке PacketZoom Android SDK, о котором мы поговорим в следующем посте.

Недавно мы сравнивали между собой HTTP библиотеки по производительности, но эта тема заслужила отдельного рассмотрения. Мы надеемся, что этот обзор дал вам основные идеи о плюсах и минусах каждой библиотеки, и мы помогли вам сделать правильный выбор. Следите за выходом более интересных постов о сетевой работе в Android от нас.

Источник

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