Upgrade to Pro — share decks privately, control downloads, hide ads and more …

La stack réseau Android, disponible également pour vos backs

La stack réseau Android, disponible également pour vos backs

05dd369062f7c4e450e1e08d1471da5b?s=128

Jeremie Martinez

April 06, 2015
Tweet

Transcript

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

  2. Plan Un peu d’histoire Okio, le socle OkHttp, le travailleur

    Retrofit, le profiteur
  3. 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)
  4. 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
  5. 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}
  6. Okio, exemple

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

  8. 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)
  9. OkHttp, c’est bien codé Immutable Synchrone Asynchrone avec callback Facilement

    configurable Fluent Complexe mais clair {KILLER FEATURES}
  10. OkHttp, c’est testable Introduction de MockWebServer Mockito like dans le

    fonctionnement Tout est testable (Header, Code, Caching, Réponse, …) Sous forme de queue
  11. OkHttp, c’est démontrable LIVE CODE !!! compile 'com.squareup.okhttp:okhttp:2.2.0'
 testCompile 'com.squareup.okhttp:mockwebserver:2.2.0'

  12. 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”
  13. Retrofit - Déclaration public interface XebiaApi { @GET("/users") List<User> users();

    } Déclaration de l’ API côté client
  14. Retrofit - Déclaration @GET(“/users/{id}“) User user(@Path(“id”) long id); Ajout d’un

    paramètre
  15. Retrofit - Déclaration @GET(“/users/{id}“) User user( @Path(“id”) long id, @Query(“details”)

    boolean details ); Ajout d’une query
  16. Retrofit - Déclaration @POST(“/users/create“) void createUser(@Body User user); Avec un

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

    Response
  18. Retrofit - Déclaration @FormUrlEncoded @POST(“/users/create“) void createUser(@Field("login") String login); En

    form url encoded
  19. Retrofit - Déclaration @Multipart @POST(“/users/create“) void createUser( @Part("photo") TypedFile photo,

    @Part("desc") TypedString desc ); En multipart
  20. Retrofit - Déclaration @Headers("Cache-Control: max-age=640000") @GET(“/users/create“) List<User> users(); Header @GET(“/users/create“)

    List<User> users( @Header(“authorization”) String authorization ); Dynamic header
  21. 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);
  22. Retrofit - Threading Synchrone Asynchrone Observable @GET("/users") List<User> users(); @GET("/users")

    void users(Callback<List<User>> callback); @GET("/users") Observable<List<User>> users();
  23. Retrofit - Error Handling Synchrone try { List<User> users =

    xebiaApi.users(); } catch(RetrofitError error) { // Handle error }
  24. Retrofit - Error Handling Asynchrone xebiaApi.users(new Callback<List<User>>() { void success(List<User>

    users, Response response) { // Handle success } void failure(RetrofitError error) { // Handle error } });
  25. Retrofit - Error Handling Observable xebiaApi.users() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(new Func1<List<User>,

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

    -> { /* Handle success each user */ },
 throwable -> { /* Handle error */ }
 );
  27. 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();
  28. 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<User> users() { return Arrays.asList(new User(“user1”), …); } }
  29. Retrofit - Bilan Déclaratif Type-safe Encapsulation Agnostique Suppression boilerplate Facilement

    testable Riche en fonctionnalités Moderne grâce à OkHttp {KILLER FEATURES}
  30. 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
  31. Pourquoi l’adopter ? Très peu de code Facile Testable entièrement

    Agnostique Moderne Compréhensible Éprouvé
  32. Questions ?