Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Consumindo API's Rest com Retrofit 2
Search
Felipe Arimateia
March 21, 2017
Technology
34
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Consumindo API's Rest com Retrofit 2
Talk apresenta no Android Meetup BH - Droid Talks S02E03.
#retrofit #android
Felipe Arimateia
March 21, 2017
More Decks by Felipe Arimateia
See All by Felipe Arimateia
Compartilhando e acelerando com módulos em aplicações Android v2
felipearimateia
1
170
Compartilhando e acelerando com módulos em aplicações Android
felipearimateia
2
57
Firebase além do chat
felipearimateia
0
98
Firebase ML Kit: Educando com Machine Learning
felipearimateia
0
35
Monetizando suas aplicações: O que pode e o que não pode, e como fazer
felipearimateia
0
58
Testes de UI legíveis e sustentáveis para Android
felipearimateia
0
31
Cloud Functions para Firebase
felipearimateia
1
48
Construindo Aplicações Android com Firebase
felipearimateia
1
81
Firebase: dando um Up na sua aplicação.
felipearimateia
0
130
Other Decks in Technology
See All in Technology
ラジオの科学
frievea
0
320
モノリス Rails でも日中に rails db:migrate を走らせたい! / Daytime rails db:migrate on Monolithic Rails!
euglena1215
4
590
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
280
変化の早いClaude Codeを 書籍に落とし込む
oikon48
7
1.4k
Bits AI を制するものは Datadog を制す / The player that controls Bits AI, controls Datadog
kaminashi
0
110
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
300
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
330
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
5.9k
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
250
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
つくって納得、つかって実感! 大規模言語モデルことはじめ ver2.0
recruitengineers
PRO
4
1.7k
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
300
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Ruling the World: When Life Gets Gamed
codingconduct
0
300
Unsuck your backbone
ammeep
672
58k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
280
Leo the Paperboy
mayatellez
8
2.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
First, design no harm
axbom
PRO
2
1.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
490
A Soul's Torment
seathinner
6
3.4k
Transcript
Consumindo API's Rest com Retrofit 2
hello! Felipe Arimateia Software Engineer na CI&T e amante de
séries.
1. Retrofit Retrofit é uma biblioteca segura para consumir API's
REST em Android ou Java desenvolvida pela Square.
“ Uma das principais funcionalidades do Retrofit é abstrair a
complexidade de se criar e gerenciar conexões para API's.
2. OKHTTP OkHttp é uma biblioteca desenvolvida pela Square para
realizar requisições HTTP.
“ OkHttp foi construído por cima da biblioteca Okio, que
tenta ser mais eficiente que as bibliotecas de I/O padrão do Java, criando um pool de memória compartilhada.
Exemplo https://github.com/androidbh/a ndroid_feedwrangler_example
Setup dependencies { compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.2.0' }
Converters Converter Library Gson com.squareup.retrofit2:converter-gson Jackson com.squareup.retrofit2:converter-jackson Moshi com.squareup.retrofit2:converter-moshi Protobuf
com.squareup.retrofit2:converter-protobuf Wire com.squareup.retrofit2:converter-wire Simple XML com.squareup.retrofit2:converter-simplexml
Retrofit instance Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://feedwrangler.net/") .build(); FeedWranglerApi
api = retrofit.create(FeedWranglerApi.class);
Endpoints public interface FeedWranglerApi { @GET("api/v2/podcasts/categories") Call<ResponseApi<Category>> getCategories(); @GET("api/v2/podcasts/category/{id}") Call<ResponseApi<Podcast>>getCategory(@Path("id")
int id); @GET("api/v2/podcasts/search") Call<ResponseApi<Podcast>>search(@Query("search_term") String term); }
Endpoints public interface FeedWranglerApi { @POST("api/v2/users/authorize") Call<ResponseApi<User>> authorize(@Body User user);
}
Annotations Annotation Descrição @Path Adiciona paths no final do endpoint
@Query Adiciona queries na requisição @Body Defini o payload para requisições POST @Header Adiciona cabeçalhos na requisição
Executando Call<ResponseApi<Category>> call = api.getCategories(); call.enqueue(new Callback<ResponseApi<Category>>() { @Override public
void onResponse(Call<ResponseApi<Category>> call, Response<ResponseApi<Category>> response) { ResponseApi responseApi = response.body(); //... } @Override public void onFailure(Call<ResponseApi<Category>> call, Throwable t) {} });
Cancelando call.enqueue(new Callback<ResponseApi<Category>>() { @Override public void onResponse(Call<ResponseApi<Category>> call, Response<ResponseApi<Category>>
response) { if (response.isSuccessful()) {//...} } @Override public void onFailure(Call<ResponseApi<Category>> call, Throwable t) { if (call.isCanceled()) { Log.d(TAG, "requisição cancelada");} } }); call.cancel();
Error Object { error = "Not authorized"; result = "error";
}
Simples Error Handler public static ResponseApi parseError(Response<?> response) { Converter<ResponseBody,
ResponseApi> converter = RestAdpter.retrofit() .responseBodyConverter(ResponseApi.class, new Annotation[0]); ResponseApi error; try { error = converter.convert(response.errorBody()); } catch (IOException e) {return new ResponseApi();} return error; }
Tratando error call.enqueue(new Callback<ResponseApi<Podcast>>() { @Override public void onResponse(Call<ResponseApi<Podcast>> call,
Response<ResponseApi<Podcast>> response) { if (response.isSuccessful()) {//...} else { ResponseApi responseApi = ErrorUtils.parseError(response); showMessage(responseApi.getError()); } } @Override public void onFailure(Call<ResponseApi<Podcast>> call, Throwable t) {} }
Interceptor OkHttpClient.Builder builder = new OkHttpClient.Builder(); HttpLoggingInterceptor httpLoggingInterceptor = new
HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.networkInterceptors().add(httpLoggingInterceptor); builder.build(); Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor
Interceptor return new Interceptor() { @Override public Response intercept(Chain chain)
throws IOException { Request request = chain.request(); HttpUrl url = request.url().newBuilder() .addQueryParameter("client_key", BuildConfig.CLIENT_KEY) .build(); request = request.newBuilder().url(url).build(); return chain.proceed(request); } };
Logging (Stetho) OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build();
dependencies { compile 'com.facebook.stetho:stetho:1.4.2' compile 'com.facebook.stetho:stetho-okhttp3:1.4.2' }
Interceptor Sabe quando o desenvolvedor do backend fala que o
problema de lentidão está no aplicativo? Prove para ele que não, criando um interceptor para calcular o tempo que cada requisção demora. Veja aqui um exemplo, de um interceptor que manda dados da requisição para o Answers do Fabric.
thanks! Any questions? You can find me at @twiterdoari