Возможности OkHttp о которых вы не знали

Sdílet
Vložit
  • čas přidán 5. 07. 2024
  • Из видео вы узнаете о различных API, которые помогут вам эффективнее работать с REST API, когда вы используете OkHttp и Retrofit
    🔗 Подпишись на канал / @androidbroadcast
    🔗 Avito.Tech avito.tech/
    💰 Поддержать проект на Boosty bit.ly/3sratqQ или Patreon / android_broadcast
    🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast
    🔗 Мерч от Android Broadcast androidbroadcaststore.by/
    🔗 OkHttp square.github.io/okhttp
    🔗 Retrofit square.github.io/retrofit
    🔗 MockWebServer github.com/square/okhttp/tree...
    #AndroidBroadcast #REST #OkHttp #Retrofit #HTTP #HTTPS #Сеть #RESTAPI #androidstudio
    0:00 Вступление
    1:09 Retrofit
    1:57 Интеграция АвитоТех
    2:19 Жизненный цикл запроса
    4:20 Кэширование
    9:06 Interceptors
    14:05 Таймауты
    15:58 ConnectionPool
    16:59 MockWebServer
    18:11 Отладка сетевых запросов в Android Studio
    22:00 Заключение
  • Věda a technologie

Komentáře • 87

  • @AndroidBroadcast
    @AndroidBroadcast  Před 2 lety +4

    🔗 Avito.Tech avito.tech/
    💰 Поддержать проект на Boosty bit.ly/3sratqQ или Patreon patreon.com/android_broadcast
    🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast
    🔗 Мерч от Android Broadcast androidbroadcaststore.by/

  • @SergeyJasfex
    @SergeyJasfex Před 2 lety +30

    Кирилл, крутой формат, мне очень понравился. Реально экономит время и позволяет быстро ознакомиться с возможностями технологии

  • @sergeykharuk5614
    @sergeykharuk5614 Před 2 lety +29

    authenticator() использую для refreshToken-а.
    Т.е. если interceptor добавляет в хедер реквеста Bearer token (который имеет время жизни), то лямбда, переданная в authenticator(), вызовется в ответ на 401 Unauthorized в любом сделанном нами запросе (т.е. когда наш токен устарел). И таким образом, непосредственно в лямбде, которая передается в метод authenticator(), можно прописать реквест на апдейт токена)

    • @andriyshatynskyy5214
      @andriyshatynskyy5214 Před 2 lety +1

      в моем приложении на бэкенде аутентификация(access и refresh token) реализована через JWT(делал не я), возможно ли использовать Okhttp Interceptor что делать рефреша токена?

    • @BelokonRoman
      @BelokonRoman Před 2 lety +8

      @@andriyshatynskyy5214 возможно. Но только не interceptor, а authenticator. Стандартный подход: Interceptor для добавления accessToken-а в хэдэр запроса, authenticator для обновления accessToken-а с помощью refreshToken-a когда первый протух(бэк должен вернуть 401 в этом случае)

    • @andriyshatynskyy5214
      @andriyshatynskyy5214 Před 2 lety +1

      @@BelokonRoman спасибо

    • @aidardauylbay8116
      @aidardauylbay8116 Před 2 lety +1

      Тоже самое, но самый явный недостаток Authenticator в том, что при параллельных запросах, все неавторизованные запросы вызывают его, и нужно вручную их синхронизировать

    • @RussianTeaMachine
      @RussianTeaMachine Před 2 lety

      В обычном interceptor будет тоже самое, тоже нужно использовать синхронизацию. Я не стал использовать authenticator т.к. при использовании стандартных логов okhttp логи рефреша токена не отображаются.

  • @ultraon83
    @ultraon83 Před 2 lety +6

    Если backend не поддерживает Cache-Control, мы все ещё можем сделать активацию http cache на стороне клиента используя interceptor (возможно network interceptor, точно не помню) OkHttp. В interceptor мы модифицируемых response добавляя нужные headers как бы от сервера. Это быстрое решение, чтобы снизить нагрузку на backend.

  • @user-sankarsana
    @user-sankarsana Před 2 lety

    Крутяк! Кирилл, спасибо за труды.

  • @user-yg6fe2bs9u
    @user-yg6fe2bs9u Před 2 lety

    Формат - топ! Спасибо за видео)

  • @thunderdoge
    @thunderdoge Před 2 lety

    Спасибо за видео!

  • @it-vk8ik
    @it-vk8ik Před rokem

    Спасибо, очень полезно.

  • @mikhailtarasov7403
    @mikhailtarasov7403 Před 2 lety

    Очень крутое и понятное видео , спасибо !

  • @Nomad7541
    @Nomad7541 Před 2 lety +6

    Очень интересный формат, ждём про другие инструменты!

  • @radpem
    @radpem Před 2 lety

    Классное видео, вот в таком формате топ

  • @ultraon83
    @ultraon83 Před 2 lety +2

    Привет. Для работы с Cache-Control header через Retrofit, можно добавить доп параметр в метод API, с аннотацией Header, и подкладывать туда значение динамически.

  • @androidkotlin-6234
    @androidkotlin-6234 Před 4 měsíci

    не знал про Network inspector. Спасибо за просвещение!

  • @qIKraytonIp
    @qIKraytonIp Před 2 lety +2

    Видос очень полезный, хотелось бе видеть больше всяких советов и best practices по retrofit.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      По retrofit мало чего рассказывать. Простая и эффективная библиотека, без усложнений и лишнего API

  • @romankryvolapov7961
    @romankryvolapov7961 Před 2 lety

    Очень интересный видос, некоторого не знал

  • @user-hf7mb7sn5t
    @user-hf7mb7sn5t Před 2 lety +2

    Кирилл, спасибо большое, как раз вопрос попался такой на собесе месяца полтора назад, все никак руки не доходили разобраться)

    • @tyt66612
      @tyt66612 Před 2 lety

      Что именно спросили?)

  • @kirillsushilnikov9614
    @kirillsushilnikov9614 Před 2 lety +2

    Network Inspector - хорошая штука, но было бы ещё хорошо, если бы он показывал ещё попытки отправки запроса на сервер (когда получаешь UnknownServerException - сервер лег или интернет плохой)

  • @pasha09090
    @pasha09090 Před 2 lety

    Спасибо

  • @bolnoi8
    @bolnoi8 Před 2 lety +1

    Спасибо, очень полезно. В тему отслеживания запросов - стоило рассказать про чакер.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Тулинг к теме видео особо не хотел подмешивать, а рассказать отдельно

  • @sergeysukharev1648
    @sergeysukharev1648 Před 2 lety +1

    Формат отличный. Почти 10К подписчиков. Много это или нет - не знаю. Но думаю, что если все 10К - разработчики, то вполне неплохо!

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Тоже задумываюсь этим вопросом. Даже непонятно какой объем этой аудитории

  • @turlir
    @turlir Před 2 lety +1

    Я использую Authenticator для работы с корпоративным OpenId. Использование Authenticator не освобождает от использования Interceptor. Через Authenticator удобно обновлять токен доступа, а через Interceptor добавлять его в заголовки запроса централизованно. На каждый уровень аутентификации добавляю Interceptor.

  • @nazirjonm6560
    @nazirjonm6560 Před 2 lety +3

    Очень круто! Сделайте пожалуйста видео по paging3 component с добавление и удаление данные в позиции)

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Видео про Paging 3 есть на канале czcams.com/video/9zVmYVDTcEM/video.html.

  • @hievery9678
    @hievery9678 Před 2 lety

    Крутой видос, познавательный, спасибо)
    Ещё для отслеживания сетевых запросов можно использовать прокси. Например Charles или бесплатный burpsuite.
    Нетворк менеджер не всегда подключен к приложению.
    А прокси, если правильно настроить, перехватывает трафик всегда. И если вдруг вылетел какой-то непонятный баг, то с прокси можно просто посмотреть, не бэк ли это непонятно что кинул.
    + в прокси, (по крайней мере Charles) есть возможности подмены, как запросов, так и ответов.
    А такие фичи, как перезаписывание ответа сервера из выбранного файла делают разработку/тестирование новых/измененных ручек ооочень удобным. Ctrl+s после изменения файлика в любимом редакторе и вуаля, приложению приходит новый ответ. Приложение не надо ни пересобирать, ни перезапускать.
    Правда такую точную инфу, как сколько сейчас конекшенов и как между ними распределились запросы прокси конечно не скажет, но в большинстве случаев это и не надо.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Charles - это прокси и больше подходит для тестирования, а вот сетевой инспектор предоставляет больше информации для отладки и понимания, где происходит проблема с вызовами. Инструменты не взаимозаменяемые

    • @hievery9678
      @hievery9678 Před 2 lety

      @@AndroidBroadcast
      Если надо поинспектить приложение, то полностью согласен.
      Но если использовать его чисто как просматривалку запросов/ответов, то они вполне взаимозаменяемые. Я именно такой юзкейс и имел ввиду.
      Мне показалось, что будет полезно упомянуть прокси. Вдруг для кого-то новенького это будет лучшей альтернативой, про которую он не знал.

  • @arsenthompson
    @arsenthompson Před 2 lety

    Спаассииибо

  • @hievery9678
    @hievery9678 Před 2 lety

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

  • @nikitakhrushchev509
    @nikitakhrushchev509 Před 2 lety +1

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

  • @itgik
    @itgik Před 2 lety

    Спасибо за видео. А как добавить tab Network inspector? У меня его нет. Благодарю.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Он появился в Android Studio Bumble в том виде в котором я показал. До этого он был в секции "Profilers"

  • @RRRazzzaRRR
    @RRRazzzaRRR Před 2 lety

    Круто и как всегда вовремя)
    Друзья, а если в примере с апи-кеем он бы менялся со временем, то что делать тогда?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Надо просто сделать другую реализацию, где можно поменять ключ. Это не так сложно. Проблема в том что часть запросов может уйти со старым ключом

  • @BelokonRoman
    @BelokonRoman Před 2 lety +1

    10:05 - тут даже больше поможет value class чем именнованные параметры. Потому что именованные параметры - это добровольное дело на вызывающей стороне, а если token обернуть в какой нибудь value class AccessToken(private val token: String),то на вызывающей стороне уже полюбому придется передавать нужный объект. Но при этом в скомпилированном коде будет просто строка

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Только с ним должен уметь работать сериализатор

    • @BelokonRoman
      @BelokonRoman Před 2 lety +1

      @@AndroidBroadcast в том то и прелесть value class-ов, что ничего дополнительно не надо, т.к. он в конечном счете бедут заменен на примитив, который не требует дополнительных сериализаторов\десереализаторов.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Не во всех случаях. Как раз-то в интерфейсе они могут остаться обычным классом. Посмотрите спецификацию их, там много случаев когда остаётся класс обёртка

    • @BelokonRoman
      @BelokonRoman Před 2 lety +1

      @@AndroidBroadcast Я знаю. Но голая обертка над не null-овым аргументом всегда будет упрощена до примитива и при этом дает compile time гарантию, что туда не передадут ничего другого. В этом случае есть только выгоды и я не вижу никаких недостатков. А если вы уже начинаете наварачивать что то дополнительное в этоу обертку - то тогда надо уже переходить к обычному классу. Ну и если параметр может быть null - то тоже теряется вся прелесть этого value class-а. Это всего лишь вопрос правильного применения инструментов.

    • @DonkeyKong68
      @DonkeyKong68 Před 2 lety

      Конкретно в этом случае должно хватить и typealias

  • @bekaryssailaukul1006
    @bekaryssailaukul1006 Před 2 lety

    Полезное видео, можно видео про как делать Refresh token ?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Универсальное нет, только если взять что у вас все сделано по зачёту OAuth 2.0, что я не встречал (

  • @danik030699
    @danik030699 Před 2 lety

    Круто! А что если делать интеграцию после введения и до кода. В текущем варианте сильно сбивает с мысли/настроя.

  • @kirillsushilnikov9614
    @kirillsushilnikov9614 Před 2 lety

    Спасибо за видос. Немного для меня не ясно с chain. Если я добавлю несколько интерсепторов (в одном, скажем добавлю user-agent, в другом упомянутый apikey), то будет ли запрос отправлен на сервер несколько раз, обрастая параметрами?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

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

    • @kirillsushilnikov9614
      @kirillsushilnikov9614 Před 2 lety

      @@AndroidBroadcast спасибо большое!

  • @user-ji7xx4nk2b
    @user-ji7xx4nk2b Před 2 lety

    В каких случаях может понадобиться использовать какие-то библиотеки кроме retrofit? Например, тот же OkHttp в чистом виде или Volley?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Например, когда нужно делать тонкую настройку Http запроса в runtime. Retrofit позволяет эффективно работать с REST, т.е. есть четкий набор вызовов.

  • @Mazaxict11
    @Mazaxict11 Před 2 lety +1

    Как правильно выбрать резмер кэша?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Общего правила нет и зависит от многих факторов: что вы туда будете класть, как много данных будет, как долго вы ожидаете его хранение в кэше, сколько место у вас у телефоне и пр.

  • @AndreyDerkach8
    @AndreyDerkach8 Před 2 lety

    в своих пет проектах использую ktor 😎

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Насколько помню на JVM он работает поверх OkHttp ?

  • @woffka94
    @woffka94 Před 2 lety

    Можно сделать обёртку для okhttp (работает при чистом okhttp, при retrofit+okhttp и в кмм ktor+okhttp engine/ktor+Ios engine). Возвращает или Single/suspend, если надо что-то одно (кэш или апи), или Observable/Flow, если надо оба или одно, но в каком-то определённом порядке (с флагом откуда данные пришли).

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      А зачем?

    • @woffka94
      @woffka94 Před 2 lety

      ​@@AndroidBroadcast чтобы сразу показать контент, а не пустой экран (если у нас есть кэш и он не просрочился), и поверх него догрузить уже новый (если он есть).
      Конечно можно сделать всё нативно через рум, но тогда надо хендлить когда кэш просрочился, как-то хендлить размер кэша, как-то мержить квери для нескольких таблиц, если на одном экране несколько запросов и у них разные данные и другие заботы. Но если поиск или другие квери по БД не нужны, то зачем?
      С обёрткой код менять практически не надо будет, а так же сохраняется возможность комбайнить несколько запросов (если экран сложный и состоит из N запросов), флэтмапить их (при этом если хоть в одном запросе в цепочке "кэш" будет ошибка кэша, то вся цепочка проигнорится и будет грузить только апишная) или комбайнить кэш + не кэш (условно один поддерживает кэш, а второй нет, но мы хотим первый показать сразу и догружать, а второй просто догружать) без какой-либо мудрёной логики.
      Ретрофит по дефолту вернёт кэш, только если ошибка с интернетом (и при чём никак не скажет о том, что данные из кэша, а не из апи)

  • @user-gv6ih7ct9p
    @user-gv6ih7ct9p Před 2 lety

    А будут видео как создавалось приложение для devtools?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Да, в ноябре буду кодить в прямом эфире

  • @kirillsushilnikov9614
    @kirillsushilnikov9614 Před 2 lety

    Network Inspector очень похож на раздел Network профайлера. Это одно и то же или они все же различаются?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Да, просто в последней студии произошло перемещение раздела

    • @kirillsushilnikov9614
      @kirillsushilnikov9614 Před 2 lety

      @@AndroidBroadcast А, вот в чем дело. Спасибо за ответ и за видео.

  • @ivanchepelkin6347
    @ivanchepelkin6347 Před 2 lety

    Про кэш: я правильно понял, что нужно создавать специальную директорию на андройде и тогда там это все хранить? как тогда можно сделать эту директорию безопасной, чтоб никто не имел доступа к вашему кэшу?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Нужно создавать эту директорию на internal storage. Можно использовать Context.cacheDir

  • @kirillsushilnikov9614
    @kirillsushilnikov9614 Před 2 lety

    По поводу размера кеша. Неужели сам Android на уровне ОС не ограничивает это?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Есть стандартный контролируемый кэш, но никто не мешает вне его содержание дать папку и туда что-то складывать

    • @kirillsushilnikov9614
      @kirillsushilnikov9614 Před 2 lety

      @@AndroidBroadcast Да... Google прислушивается к пользователям, старается снизить уровень энергопотребления, работает над безопасностью и прочим. Но не может помешать разработчику завалить всю память в устройстве как раз навреное по этой причине, потому что функицонирование программы может нарушиться.

  • @anddev6505
    @anddev6505 Před 2 lety

    Формат отличный, от содержания ожидал большей глубины

  • @user-not_defined
    @user-not_defined Před 2 lety

    Видео немного на 2:23 обрезалось

  • @benedikt7777
    @benedikt7777 Před 2 lety

    Апикей он же токен, верно?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Это разные вещи, но работа с ними примерно одинаково осуществляется

    • @aratj
      @aratj Před 2 lety

      можно сказать так , мы так же токены через интерцептеры для всех запросов выткаем

  • @Chernov1984
    @Chernov1984 Před 2 lety

    +

  • @kamilchulakov
    @kamilchulakov Před 2 lety +2

    Про жизненный цикл ничего не знал :|

  • @Vlad_Gromov_1992
    @Vlad_Gromov_1992 Před 2 lety

    Sps