Slide 1

Slide 1 text

La stack réseau Android, aussi utilisable sur vos backs! @JeremMartinez

Slide 2

Slide 2 text

Plan Un peu d’histoire Okio, le socle OkHttp, le travailleur Retrofit, le profiteur

Slide 3

Slide 3 text

Un peu d’histoire Apache HTTP Client • Android 1.0 • API très vieille • Buggé • Peu évolué HttpUrlConnection • Android 1.0 • TRÈS buggé ( ≠ bugs sur ≠ versions)

Slide 4

Slide 4 text

OkHttp Introduction en mai 2013 par Square Flexible (non dépendant de la plateforme) API Moderne et utilisant les dernières technos Mise en place d’une compatibilité avec les API legacy Intégration OkHttp à AOSP avec Android 4.4

Slide 5

Slide 5 text

Okio Est le socle des streams de OkHttp Complémentaire et compatible avec les packages java.io et java.nio Seulement des bytes ! 2 types de données : ByteString et Buffer 2 types de stream : Source et Sink API simple et efficace (md5, sha256, base64, utf8, hex, …) {KILLER FEATURES}

Slide 6

Slide 6 text

Okio, exemple

Slide 7

Slide 7 text

Okio, un autre exemple LIVE CODE !!! compile 'com.squareup.okio:okio:1.1.0'

Slide 8

Slide 8 text

OkHttp, c’est moderne Support de HTTP/2 et SPDY Utilisation transparente de GZIP Cache pour les réponses très efficace Capacité à récupérer silencieusement des problèmes de connections Consommation des adresses alternatives (data center) Implémentation moderne pour le TLS (SNI et ALPN)

Slide 9

Slide 9 text

OkHttp, c’est bien codé Immutable Synchrone Asynchrone avec callback Facilement configurable Fluent Complexe mais clair {KILLER FEATURES}

Slide 10

Slide 10 text

OkHttp, c’est testable Introduction de MockWebServer Mockito like dans le fonctionnement Tout est testable (Header, Code, Caching, Réponse, …) Sous forme de queue

Slide 11

Slide 11 text

OkHttp, c’est démontrable LIVE CODE !!! compile 'com.squareup.okhttp:okhttp:2.2.0'
 testCompile 'com.squareup.okhttp:mockwebserver:2.2.0'

Slide 12

Slide 12 text

OkHttp, c’est extensible Retrofit Créé en 2010 par Bob Lee (Lead core Android, CTO Square, créateur Guice, Guava, Dagger, Lead JSR 330) Rendu public en mai 2013 Maintenu par les mêmes personnes qu’OkHttp “Un client REST type-safe”

Slide 13

Slide 13 text

Retrofit - Déclaration public interface XebiaApi { @GET("/users") List users(); } Déclaration de l’ API côté client

Slide 14

Slide 14 text

Retrofit - Déclaration @GET(“/users/{id}“) User user(@Path(“id”) long id); Ajout d’un paramètre

Slide 15

Slide 15 text

Retrofit - Déclaration @GET(“/users/{id}“) User user( @Path(“id”) long id, @Query(“details”) boolean details ); Ajout d’une query

Slide 16

Slide 16 text

Retrofit - Déclaration @POST(“/users/create“) void createUser(@Body User user); Avec un Body

Slide 17

Slide 17 text

Retrofit - Déclaration @POST(“/users/create“) Response createUser(@Body User user); Récupération d’une Response

Slide 18

Slide 18 text

Retrofit - Déclaration @FormUrlEncoded @POST(“/users/create“) void createUser(@Field("login") String login); En form url encoded

Slide 19

Slide 19 text

Retrofit - Déclaration @Multipart @POST(“/users/create“) void createUser( @Part("photo") TypedFile photo, @Part("desc") TypedString desc ); En multipart

Slide 20

Slide 20 text

Retrofit - Déclaration @Headers("Cache-Control: max-age=640000") @GET(“/users/create“) List users(); Header @GET(“/users/create“) List users( @Header(“authorization”) String authorization ); Dynamic header

Slide 21

Slide 21 text

Retrofit - Création RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(“http://blog.xebia.fr”) .setClient(…) // transport agnostic .setConverter(…) // content format agnostic // JSON, Proto, … .setErrorHandler(…) // global error handler .setExecutors(…) // executor agnostic .setLogLevel(…) // log level .build(); XebiaApi service = restAdapter.create(XebiaApi.class);

Slide 22

Slide 22 text

Retrofit - Threading Synchrone Asynchrone Observable @GET("/users") List users(); @GET("/users") void users(Callback> callback); @GET("/users") Observable> users();

Slide 23

Slide 23 text

Retrofit - Error Handling Synchrone try { List users = xebiaApi.users(); } catch(RetrofitError error) { // Handle error }

Slide 24

Slide 24 text

Retrofit - Error Handling Asynchrone xebiaApi.users(new Callback>() { void success(List users, Response response) { // Handle success } void failure(RetrofitError error) { // Handle error } });

Slide 25

Slide 25 text

Retrofit - Error Handling Observable xebiaApi.users() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(new Func1, Observable>() { @Override public Observable call(List users) { return Observable.from(users); }}) .subscribe( new Action1() { @Override public void call(User user) { // Handle success each user }}, new Action1() { @Override public void call(Throwable throwable) { // Handle error }} );

Slide 26

Slide 26 text

Retrofit - Error Handling Observable xebiaApi.users()
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 users -> { /* Handle success each user */ },
 throwable -> { /* Handle error */ }
 );

Slide 27

Slide 27 text

Retrofit - Interceptor Par exemple : Global header RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(“http://blog.xebia.fr”) .setRequestInterceptor(new RequestInterceptor(){ @Override public void intercept(RequestFacade request) { request.addHeader("User-Agent", “xebia"); } }) .build();

Slide 28

Slide 28 text

Retrofit - Tests MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter); mockRestAdapter.setDelay(1000); mockRestAdapter.setErrorPercentage(0); XebiaApi xebiaApi = mockRestAdapter.create(XebiaApi.class, new MockXebiaApi()); MockRestAdapter public class MockXebiaApi implements XebiaApi { @Override public List users() { return Arrays.asList(new User(“user1”), …); } }

Slide 29

Slide 29 text

Retrofit - Bilan Déclaratif Type-safe Encapsulation Agnostique Suppression boilerplate Facilement testable Riche en fonctionnalités Moderne grâce à OkHttp {KILLER FEATURES}

Slide 30

Slide 30 text

LIVE CODE !!! compile 'com.squareup.okhttp:okhttp:2.2.0'
 compile 'com.squareup.retrofit:retrofit:1.9.0'
 compile 'com.squareup.retrofit:retrofit-mock:1.9.0'
 testCompile 'com.squareup.okhttp:mockwebserver:2.2.0' Retrofit in Action

Slide 31

Slide 31 text

Pourquoi l’adopter ? Très peu de code Facile Testable entièrement Agnostique Moderne Compréhensible Éprouvé

Slide 32

Slide 32 text

Questions ?