$30 off During Our Annual Pro Sale. View Details »

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

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

Jeremie Martinez

April 06, 2015
Tweet

More Decks by Jeremie Martinez

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  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)

    View Slide

  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

    View Slide

  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}

    View Slide

  6. Okio, exemple

    View Slide

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

    View Slide

  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)

    View Slide

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

    View Slide

  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

    View Slide

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

    testCompile 'com.squareup.okhttp:mockwebserver:2.2.0'

    View Slide

  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”

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. 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

    View Slide

  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);

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. 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
    }}
    );

    View Slide

  26. Retrofit - Error Handling
    Observable
    xebiaApi.users()

    .subscribeOn(Schedulers.io())

    .observeOn(AndroidSchedulers.mainThread())

    .subscribe(

    users -> { /* Handle success each user */ },

    throwable -> { /* Handle error */ }

    );

    View Slide

  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();

    View Slide

  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 users() {
    return Arrays.asList(new User(“user1”), …);
    }
    }

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  32. Questions ?

    View Slide