Подключение библиотеки

Как обычно, прописываем зависимость в файле buld.gradle:

  1. compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

Т. к. библиотека находится на стадии beta, версия библиотеки может часто меняться, поэтому советую узнать последнюю версию библиотеки здесь.

Retrofit автоматически тянет с собой библиотеку OkHttp. Если у вас в зависимостях уже есть эта библиотека, то нужно исключить OkHttp из Retrofit:

  1. compile ('com.squareup.retrofit2:retrofit:2.0.0-beta4') {
  2. // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
  3. exclude module: 'okhttp'
  4. }
  5. compile 'com.squareup.okhttp3:okhttp:3.0.0'
compile ('com.squareup.retrofit2:retrofit:2.0.0-beta4') {  
  // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
  exclude module: 'okhttp'
}
compile 'com.squareup.okhttp3:okhttp:3.0.0'

А вот так библиотека подключается через Maven:

  1. <dependency>
  2. <groupId>com.squareup.retrofit2</groupId>
  3. <artifactId>retrofit</artifactId>
  4. <version>2.0.0-beta4</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.squareup.okhttp</groupId>
  8. <artifactId>okhttp</artifactId>
  9. <version>3.0.0</version>
  10. </dependency>
<dependency>  
  <groupId>com.squareup.retrofit2</groupId>
  <artifactId>retrofit</artifactId>
  <version>2.0.0-beta4</version>
</dependency>  
<dependency>  
  <groupId>com.squareup.okhttp</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.0.0</version>
</dependency>

Подключаем конвертеры

Retrofit не поставляется вместе с библиотекой GSON, поэтому мы должны прописать ее вручную:

  1. compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

RxJava

Если вы используете RxJava в своем приложении, не забудьте прописать данные зависимости:

  1. compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
  2. compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'  
compile 'io.reactivex:rxandroid:1.0.1'

Синхронные и асинхронные запросы

Раньше, при использовании Retrofit 1.9 синхронный запрос объявлялся вот так:

  1. /* Synchronous in Retrofit 1.9 */
  2. public interface APIService {
  3. @POST("/list")
  4. Repo loadRepo();
  5. }
/* Synchronous in Retrofit 1.9 */
 
public interface APIService {
 
    @POST("/list")
    Repo loadRepo();
 
}

А асинхронный запрос вот так:

  1. /* Asynchronous in Retrofit 1.9 */
  2. public interface APIService {
  3. @POST("/list")
  4. void loadRepo(Callback<Repo> cb);
  5. }
/* Asynchronous in Retrofit 1.9 */
 
public interface APIService {
 
    @POST("/list")
    void loadRepo(Callback<Repo> cb);
 
}

В Retrofit 2.0 оба типа запросов имеют одинаковый вид:

  1. import retrofit.Call;
  2. /* Retrofit 2.0 */
  3. public interface APIService {
  4. @POST("/list")
  5. Call<Repo> loadRepo();
  6. }
import retrofit.Call;
 
/* Retrofit 2.0 */
 
public interface APIService {
 
    @POST("/list")
    Call<Repo> loadRepo();
 
}

Для синхронного запроса просто вызовите метод execute, а для асинхронного метод enqueue.

Делаем синхронный запрос

  1. // Synchronous Call in Retrofit 2.0
  2. Call<Repo> call = service.loadRepo();
  3. Repo repo = call.execute();
// Synchronous Call in Retrofit 2.0
 
Call<Repo> call = service.loadRepo();
Repo repo = call.execute();

Данный код должен вызываться в новом потоке, иначе приложение вылетит с ошибкой NetworkOnMainThreadException, т. к. запросы к сети в главном потоке запрещены. Для вызова метода execute используйте фоновые потоки.

Делаем асинхронный запрос

  1. // Asynchronous Call in Retrofit 2.0
  2. Call<Repo> call = service.loadRepo();
  3. call.enqueue(new Callback<Repo>() {
  4. @Override
  5. public void onResponse(Response<Repo> response) {
  6. // Get result Repo from response.body()
  7. }
  8. @Override
  9. public void onFailure(Throwable t) {
  10. }
  11. });
// Asynchronous Call in Retrofit 2.0
 
Call<Repo> call = service.loadRepo();
call.enqueue(new Callback<Repo>() {
    @Override
    public void onResponse(Response<Repo> response) {
        // Get result Repo from response.body()
    }
 
    @Override
    public void onFailure(Throwable t) {
 
    }
});

Код, представленный выше выполняет запрос в фоновом потоке, после в главном потоке вызывает метод onResponse или onFailure, в зависимости от результата. Для извлечения ответа от сервера используйте response.body().

Отмена запроса

Для отмены запроса используется метод cancel():

  1. call.cancel();
call.cancel();

Создание сервиса

В Retrofit 1.9 дополнение GsonConverter входило в пакет и автоматически инициализировался при создании RestAdapter. В Retrofit 2.0 нам нужно вручную подключать и инициализировать GsonConverter:

  1. compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

Конвертер добавляется с помощью метода addConverterFactory. Заметьте, что теперь RestAdapter называется Retrofit:

  1. Retrofit retrofit = new Retrofit.Builder()
  2. .baseUrl("http://api.nuuneoi.com/base/")
  3. .addConverterFactory(GsonConverterFactory.create())
  4. .build();
  5. service = retrofit.create(APIService.class);
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://api.nuuneoi.com/base/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
 
service = retrofit.create(APIService.class);

Вот список официальных конвертеров, поддерживаемых Square:

  • Gson: com.squareup.retrofit:converter-gson
  • Jackson: com.squareup.retrofit:converter-jackson
  • Moshi: com.squareup.retrofit:converter-moshi
  • Protobuf: com.squareup.retrofit:converter-protobuf
  • Wire: com.squareup.retrofit:converter-wire
  • Simple XML: com.squareup.retrofit:converter-simplexml

Вы также можете создать свой конвертер, реализовав интерфейс Converter.Factory.

Кастомный GSON-объект

Если вы хотите изменить формат какого-нибудь JSON-объекта, то это можно сделать с помощью GsonConverterFactory.create():

  1. Gson gson = new GsonBuilder()
  2. .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
  3. .create();
  4. Retrofit retrofit = new Retrofit.Builder()
  5. .baseUrl("http://api.nuuneoi.com/base/")
  6. .addConverterFactory(GsonConverterFactory.create(gson))
  7. .build();
  8. service = retrofit.create(APIService.class);
Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
        .create();
 
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://api.nuuneoi.com/base/")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();
 
service = retrofit.create(APIService.class);

Готово.

Новая концепция построения URL

Retrofit 2.0 предоставляет новую концепцию построения URL-запроса. Пожалуйста, взгляните на примеры ниже:

apiservice1 apiservice2 apiservice3

Как видно на скриншотах построение URL зависит от слешей, добавленных в базовом URL или в URL запроса.

В Retrofit 2.0 предлагается новый способ построения URL:

— Базовый URL: всегда заканчивается /
— @Url: НЕ начинается /

Например:

  1. public interface APIService {
  2. @POST("user/list")
  3. Call<Users> loadUsers();
  4. }
  5. public void doSomething() {
  6. Retrofit retrofit = new Retrofit.Builder()
  7. .baseUrl("http://api.nuuneoi.com/base/")
  8. .addConverterFactory(GsonConverterFactory.create())
  9. .build();
  10. APIService service = retrofit.create(APIService.class);
  11. }
public interface APIService {
 
    @POST("user/list")
    Call<Users> loadUsers();
 
}
 
public void doSomething() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.nuuneoi.com/base/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
 
    APIService service = retrofit.create(APIService.class);
}

При вызове loadUsers будет сделан запрос на адрес http://api.nuuneoi.com/base/user/list.

Кроме того, в Retrofit 2.0 мы можем указать полный URL:

  1. public interface APIService {
  2. @POST("http://api.nuuneoi.com/special/user/list")
  3. Call<Users> loadSpecialUsers();
  4. }
public interface APIService {
 
    @POST("http://api.nuuneoi.com/special/user/list")
    Call<Users> loadSpecialUsers();
 
}

При этом базовый URL будет проигнорирован.  Как видите в Retrofit 2.0 принцип построения URL существенно отличается оп предыдущих версий, поэтому не забудьте исправить URL-адреса в ваших проектах.

OkHttp стал обязательным

В Retrofit 1.9 библиотека OkHttp была необязательной. В Retrofit 2.0 OkHttp подключается автоматически, т. к. она прописана в зависимостях Retrofit.

onResponse вызывается даже при проблемах с ответом

Если после запроса Retrofit 1.9 не мог преобразовать ответ от сервера в объект, то вызывался метод Callback’а, сообщающего об ошибке (onFailure). Теперь же,  Retrofit 2.0 вызывает метод onResponse не зависимо от того, смогла она разобрать ответ или нет.

response

Метожы Response/Failure сильно различаются в Retrofit 1.9 и 2.0, поэтому будьте осторожны при переходе на новую версию.

Пропущенное разрешение для доступа в интернет вызывает SecurityException

В Retrofit 1.9 при пропуске разрешения для доступа в интернет, вызов асинхронной операции возвращал ошибку PERMISSION DENIED в Callback. В Retrofit 2.0 при пропуске разрешения выбрасывается исключение SecurityException.

sec

Это похоже на поведение при его использовании HttpURLConnection. В любом случае, не составляет никакого труда добавить разрешение на интернет в AndroidManifest.xml.


Comments and questions

Comment
http://javaway.info/ispolzovanie-retrofit-2-v-prilozheniyah-android/
Hello2017-08-31 21:09:28

Publish comment or question

Copyright 2018 © ELTASK.COM
All rights reserved.