SlideShare a Scribd company logo
Working with API
Что такое Retrofit
Retrofit (согласно официальному сайту) — типобезопасный
HTTP-клиент для Android и Java. Он является
незаменимым инструментом для работы с API в клиент-
серверных приложениях. Каких-то лет 5 назад Android-
разработчикам для работы с сетью приходилось воротить
горы кода с обратными вызовами, AsyncTask'ами и
прочими «низкоуровневыми» вещами. И компания Square
выпустила такую замечательную библиотеку — Retrofit.
Добавляем в build.gradle
compile 'com.squareup.retrofit2:retrofit:2.3.0'
И ждем
Качаем Retrofit и OkHttp
База с endpoint
- Создаем класс типа Interface и описываем все наши
эндпоинты
public interface Endpoint { }
Пример на Kotlin
Формат ендпоинтов
Если нужно добавить динамически формировать урл то
используем Path
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
Если нужно вставлять параметры в Get запрос типа
?sort=desc то
@Query("sort") String sort
Если список параметров query динамичен то используем
@QueryMap Map<String, String> options
Также мы можем отправлять обьекты как тело запроса.
@POST("users/new")
Call<User> createUser(@Body User user);
Также POST запросы должны быть в формате Form-encoded
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
Если же мы добавляем кастомные обьекты в виде фоток или
файлов то необходимо использовать MultiPart
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody
description);
ApiClient.get().groupList(userId).enqueue(object: Callback<List<User>> {
override fun onResponse(call: Call<ListDayWeather>?, response:
Response<ListDayWeather>) {
if (response.isSuccessful) {
// viewInterface?.showUserList(response.body)
} else {
// viewInterface?.showAlert()
}
}
override fun onFailure(call: Call<ListDayWeather>?, t: Throwable?) {
viewInterface?.showNoInternet()
}
})
Пример запроса.
Нужно в каждый запрос
добавить хедеры?
Там где билдим http клиент добавляем следующее
okBuilder.addInterceptor { chain ->
val original = chain.request()
val request = original.newBuilder()
.header("lang", Storage.get().getLang())
.method(original.method(), original.body())
.build()
chain.proceed(request)
}
Или если нужно повторить запрос
после неуспешного вызова.
public static <T> void enqueueWithRetry(Call<T> call, final Callback<T> callback, MainActivityInterface
activityInterface) {
call.enqueue(new RetryableCallback<T>(call, activityInterface) {
@Override
public void onFinalResponse(Call<T> call, Response<T> response) {
if (activityInterface != null) { activityInterface.onSuccess(); }
callback.onResponse(call, response);
}
@Override
public void onFinalFailure(Call<T> call, Throwable t) {
if (activityInterface != null) { activityInterface.onErrorAfterRetry(); }
callback.onFailure(call, t);
}
});
}
И вызывать при запросе
ApiClient.get().groupList(userId).enqueue
Вместо enqueue enqueueWithRetry
Сам RetryableCallback
public abstract class RetryableCallback<T> implements Callback<T> {
private int totalRetries = 5;
private static final String TAG = RetryableCallback.class.getSimpleName();
private final Call<T> call;
private int retryCount = 0;
MainActivityInterface activityInterface;
public RetryableCallback(Call<T> call, MainActivityInterface activityInterface) {
this.call = call;
this.activityInterface = activityInterface;
}
@Override
public void onResponse(Call<T> call, Response<T> response) {
if (!isCallSuccess(response)) {
if (retryCount++ < totalRetries) {
Log.v(TAG, "Retrying API Call - (" + retryCount + " / " + totalRetries + ")");
if (activityInterface != null) {
activityInterface.onErrorInRetry();
}
retry();
} else {
onFinalResponse(call, response);
}
} else {
onFinalResponse(call, response);
}
}
@Override
public void onFailure(Call<T> call, Throwable t) {
Log.e(TAG, t.getMessage());
if (retryCount++ < totalRetries) {
Log.v(TAG, "Retrying API Call - (" + retryCount + " / " + totalRetries + ")");
if (activityInterface != null) {
activityInterface.onErrorInRetry();
}
retry();
} else {
onFinalFailure(call, t);
}
}
public void onFinalResponse(Call<T> call, Response<T> response) { }
public void onFinalFailure(Call<T> call, Throwable t) { }
private void retry() { call.clone().enqueue(this); }
public static boolean isCallSuccess(Response response) {
int code = response.code();
return (code >= 200 && code < 400);
}
}
Ссылки
http://square.github.io/retrofit/
https://blog.mindorks.com/android-development-best-
practices-83c94b027fd3
И статья вдохновившая меня.
Всем спасибо !

More Related Content

What's hot

C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
Platonov Sergey
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
Anton Arhipov
 
What’s New in PHP7?
What’s New in PHP7?What’s New in PHP7?
What’s New in PHP7?
GlobalLogic Ukraine
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
 
Asterisk: настраиваем цифровую АТС за одно занятие
Asterisk: настраиваем цифровую АТС за одно занятиеAsterisk: настраиваем цифровую АТС за одно занятие
Asterisk: настраиваем цифровую АТС за одно занятие
SkillFactory
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Ontico
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
Нельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование APIНельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование API
EatDog
 

What's hot (8)

C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
What’s New in PHP7?
What’s New in PHP7?What’s New in PHP7?
What’s New in PHP7?
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Asterisk: настраиваем цифровую АТС за одно занятие
Asterisk: настраиваем цифровую АТС за одно занятиеAsterisk: настраиваем цифровую АТС за одно занятие
Asterisk: настраиваем цифровую АТС за одно занятие
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Нельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование APIНельзя просто так взять и сделать версионирование API
Нельзя просто так взять и сделать версионирование API
 

Similar to Working with API

Retro vs Volley
Retro vs VolleyRetro vs Volley
Retro vs Volley
Artjoker
 
Как приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложенияхКак приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложениях
Denis Tsvettsih
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
CodeFest
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
Alexander Matorin
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Sigma Software
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ontico
 
Codefest-2015 Reactive Streams
Codefest-2015 Reactive StreamsCodefest-2015 Reactive Streams
Codefest-2015 Reactive Streams
Alexey Romanchuk
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
Noveo
 
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
Mail.ru Group
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Platonov Sergey
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
Igor Shkulipa
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
GoSharp
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Dev2Dev
 
Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019
Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019
Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019
Mail.ru Group
 

Similar to Working with API (20)

Retro vs Volley
Retro vs VolleyRetro vs Volley
Retro vs Volley
 
Как приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложенияхКак приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложениях
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
 
Codefest-2015 Reactive Streams
Codefest-2015 Reactive StreamsCodefest-2015 Reactive Streams
Codefest-2015 Reactive Streams
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019
Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019
Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019
 

More from Mad Devs

Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Mad Devs
 
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Mad Devs
 
Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
Mad Devs
 
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Devs
 
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy FedorenkoMad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Devs
 
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Devs
 
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMaв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Mad Devs
 
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоЛайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Mad Devs
 
Mad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrainMad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrain
Mad Devs
 
Flutter vs Native App Development
Flutter vs Native App DevelopmentFlutter vs Native App Development
Flutter vs Native App Development
Mad Devs
 
Mad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companiesMad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companies
Mad Devs
 
The paradox of choice in design
The paradox of choice in designThe paradox of choice in design
The paradox of choice in design
Mad Devs
 
Git and Github for Beginners
Git and Github for Beginners Git and Github for Beginners
Git and Github for Beginners
Mad Devs
 
How to hire freelancers
How to hire freelancersHow to hire freelancers
How to hire freelancers
Mad Devs
 
Ethereum blockchain
Ethereum blockchainEthereum blockchain
Ethereum blockchain
Mad Devs
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
Mad Devs
 
Asynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use itAsynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use it
Mad Devs
 
Ethereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактовEthereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактов
Mad Devs
 
Why we sleep. Michael Ivashenko
Why we sleep. Michael IvashenkoWhy we sleep. Michael Ivashenko
Why we sleep. Michael Ivashenko
Mad Devs
 
Удаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитикаУдаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитика
Mad Devs
 

More from Mad Devs (20)

Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
 
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество
 
Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
 
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
 
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy FedorenkoMad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
 
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
 
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMaв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
 
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоЛайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
 
Mad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrainMad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrain
 
Flutter vs Native App Development
Flutter vs Native App DevelopmentFlutter vs Native App Development
Flutter vs Native App Development
 
Mad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companiesMad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companies
 
The paradox of choice in design
The paradox of choice in designThe paradox of choice in design
The paradox of choice in design
 
Git and Github for Beginners
Git and Github for Beginners Git and Github for Beginners
Git and Github for Beginners
 
How to hire freelancers
How to hire freelancersHow to hire freelancers
How to hire freelancers
 
Ethereum blockchain
Ethereum blockchainEthereum blockchain
Ethereum blockchain
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
 
Asynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use itAsynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use it
 
Ethereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактовEthereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактов
 
Why we sleep. Michael Ivashenko
Why we sleep. Michael IvashenkoWhy we sleep. Michael Ivashenko
Why we sleep. Michael Ivashenko
 
Удаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитикаУдаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитика
 

Working with API

  • 2. Что такое Retrofit Retrofit (согласно официальному сайту) — типобезопасный HTTP-клиент для Android и Java. Он является незаменимым инструментом для работы с API в клиент- серверных приложениях. Каких-то лет 5 назад Android- разработчикам для работы с сетью приходилось воротить горы кода с обратными вызовами, AsyncTask'ами и прочими «низкоуровневыми» вещами. И компания Square выпустила такую замечательную библиотеку — Retrofit.
  • 3. Добавляем в build.gradle compile 'com.squareup.retrofit2:retrofit:2.3.0' И ждем Качаем Retrofit и OkHttp
  • 4. База с endpoint - Создаем класс типа Interface и описываем все наши эндпоинты public interface Endpoint { } Пример на Kotlin
  • 5. Формат ендпоинтов Если нужно добавить динамически формировать урл то используем Path @GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId); Если нужно вставлять параметры в Get запрос типа ?sort=desc то @Query("sort") String sort Если список параметров query динамичен то используем @QueryMap Map<String, String> options
  • 6. Также мы можем отправлять обьекты как тело запроса. @POST("users/new") Call<User> createUser(@Body User user); Также POST запросы должны быть в формате Form-encoded @FormUrlEncoded @POST("user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last); Если же мы добавляем кастомные обьекты в виде фоток или файлов то необходимо использовать MultiPart @Multipart @PUT("user/photo") Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
  • 7. ApiClient.get().groupList(userId).enqueue(object: Callback<List<User>> { override fun onResponse(call: Call<ListDayWeather>?, response: Response<ListDayWeather>) { if (response.isSuccessful) { // viewInterface?.showUserList(response.body) } else { // viewInterface?.showAlert() } } override fun onFailure(call: Call<ListDayWeather>?, t: Throwable?) { viewInterface?.showNoInternet() } }) Пример запроса.
  • 8. Нужно в каждый запрос добавить хедеры? Там где билдим http клиент добавляем следующее okBuilder.addInterceptor { chain -> val original = chain.request() val request = original.newBuilder() .header("lang", Storage.get().getLang()) .method(original.method(), original.body()) .build() chain.proceed(request) }
  • 9. Или если нужно повторить запрос после неуспешного вызова. public static <T> void enqueueWithRetry(Call<T> call, final Callback<T> callback, MainActivityInterface activityInterface) { call.enqueue(new RetryableCallback<T>(call, activityInterface) { @Override public void onFinalResponse(Call<T> call, Response<T> response) { if (activityInterface != null) { activityInterface.onSuccess(); } callback.onResponse(call, response); } @Override public void onFinalFailure(Call<T> call, Throwable t) { if (activityInterface != null) { activityInterface.onErrorAfterRetry(); } callback.onFailure(call, t); } }); } И вызывать при запросе ApiClient.get().groupList(userId).enqueue Вместо enqueue enqueueWithRetry
  • 10. Сам RetryableCallback public abstract class RetryableCallback<T> implements Callback<T> { private int totalRetries = 5; private static final String TAG = RetryableCallback.class.getSimpleName(); private final Call<T> call; private int retryCount = 0; MainActivityInterface activityInterface; public RetryableCallback(Call<T> call, MainActivityInterface activityInterface) { this.call = call; this.activityInterface = activityInterface; } @Override public void onResponse(Call<T> call, Response<T> response) { if (!isCallSuccess(response)) { if (retryCount++ < totalRetries) { Log.v(TAG, "Retrying API Call - (" + retryCount + " / " + totalRetries + ")"); if (activityInterface != null) { activityInterface.onErrorInRetry(); } retry(); } else { onFinalResponse(call, response); }
  • 11. } else { onFinalResponse(call, response); } } @Override public void onFailure(Call<T> call, Throwable t) { Log.e(TAG, t.getMessage()); if (retryCount++ < totalRetries) { Log.v(TAG, "Retrying API Call - (" + retryCount + " / " + totalRetries + ")"); if (activityInterface != null) { activityInterface.onErrorInRetry(); } retry(); } else { onFinalFailure(call, t); } } public void onFinalResponse(Call<T> call, Response<T> response) { } public void onFinalFailure(Call<T> call, Throwable t) { } private void retry() { call.clone().enqueue(this); } public static boolean isCallSuccess(Response response) { int code = response.code(); return (code >= 200 && code < 400); } }