Usando Retrofit 2 en una aplicación de Android

Usando Retrofit 2 en una aplicación de Android


Retrofit es una biblioteca conocida entre los desarrolladores de Android para redes, algunos incluso lo consideran un estándar de alguna manera. Hay muchas razones para tal popularidad: la biblioteca admite perfectamente la API REST, se prueba y configura fácilmente, y las solicitudes a través de la red con su ayuda se realizan de manera muy simple. En este artículo, le mostraré cómo configurar y usar Retrofit para implementar redes con su aplicación.


Configurar modificación


Agregue la siguiente dependencia al archivo build.gradle :


 implementation 'com.squareup.retrofit2:retrofit:2.4.0' 

Usaremos Gson para convertir JSON a POJO. Retrofit proporciona una dependencia que convierte automáticamente JSON a POJO. Para hacer esto, agregue otra dependencia al archivo build.gradle :


 implementation 'com.squareup.retrofit2:converter-gson:2.3.0' 

Si aún no se ha permitido que su aplicación funcione con la red, asegúrese de agregar la línea correspondiente al archivo AndroidManifest :


 <uses-permission android:name="android.permission.INTERNET"/> 

Después de agregar las dependencias, necesitamos escribir código para configurar la biblioteca Retrofit.


Cree una clase llamada NetworkService :


 public class NetworkService { } 

Esta clase debe ser un objeto singleton, así que declare una variable estática y una función que cree y devuelva una variable del mismo tipo que la clase. Si no sabe cómo funciona este patrón, consulte este artículo , que contiene ejemplos de implementaciones en el lenguaje Java.


 public class NetworkService { private static NetworkService mInstance; public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } } 

Para las pruebas, utilizamos el JSONPlaceholder , que proporciona una API REST en línea falsa para desarrolladores:


 https://jsonplaceholder.typicode.com 

Ahora declararemos e inicializaremos Retrofit en el constructor NetworkService :


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } } 

La configuración está completa, ahora necesitamos determinar los puntos finales que devolverán los datos.


Agregar puntos finales


Cree una interfaz llamada JSONPlaceHolderApi :


 public interface JSONPlaceHolderApi { } 

En el sitio JSONPlaceHolder, URL /posts/id es el punto final que devuelve un mensaje con el identificador apropiado. Este punto final recibe una solicitud GET y devuelve datos en formato JSON de la siguiente manera:


 { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } 

Primero, crearemos el POJO apropiado para la respuesta JSON:


 public class Post { @SerializedName("userId") @Expose private int userId; @SerializedName("id") @Expose private int id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } } 

Como puede ver, esta es una clase simple de POJO. @SerializedName() las variables usando @SerializedName() , pasando el nombre allí. Estos nombres son en realidad claves en los datos JSON devueltos por la API, por lo que puede cambiar el nombre de la variable como lo desee, pero asegúrese de que el nombre pasado a la anotación @SerializedName() esté exactamente presente en JSON.


En la interfaz creada anteriormente, defina los puntos finales con los parámetros requeridos:


 public interface JSONPlaceHolderApi { @GET("/posts/{id}") public Call<Post> getPostWithID(@Path("id") int id); } 

Dado que estamos enviando una solicitud GET, debemos aplicar la anotación @GET al método, dentro del cual se encuentra el punto final al que queremos enviar la solicitud. Como puede ver, no estamos agregando la URL completa, ya que La actualización tomará automáticamente el BASE_URL pasado a la clase NetworkService y lo agregará al resto de la URL.


El tipo de retorno del método se llama Call<Post> . Call es una clase proporcionada directamente por la propia biblioteca. Y todos los métodos en la interfaz deben devolver valores de este tipo. Esta es una clase genérica que toma el tipo de objeto que queremos convertir a JSON. Pasamos Post porque este es exactamente el objeto en el que queremos convertir la respuesta JSON. Pasamos un número entero a los parámetros y lo anotamos usando @Path , dentro del cual escribimos id . Retrofit tomará este valor y en el punto final reemplazará {id} . Por lo tanto, si pasamos el valor 1 como parámetro, el punto final se verá así /posts/1 , si pasamos el valor 10, entonces el punto final será /posts/10 .


Ahora necesitamos Retrofit para proporcionar una implementación de la interfaz JSONPlaceHolderApi . Para hacer esto, use el método create() :


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } } 

A continuación, debe obtener el JSONPlaceHolderApi de NetworkService y enviar una solicitud:


 NetworkService.getInstance() .getJSONApi() .getPostWithID(1) .enqueue(new Callback<Post>() { @Override public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) { Post post = response.body(); textView.append(post.getId() + "\n"); textView.append(post.getUserId() + "\n"); textView.append(post.getTitle() + "\n"); textView.append(post.getBody() + "\n"); } @Override public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) { textView.append("Error occurred while getting request!"); t.printStackTrace(); } }); 

El objeto Call devuelto contiene un método llamado enqueue , que toma Callback<T> como parámetro. En onResponse obtenemos el resultado Response<Post> contiene el objeto Post devuelto por el servidor. Para obtener el objeto Post sí, utilizamos el método response.body() . El resto del código es comprensible sin más explicaciones.


Enviar diferentes tipos de solicitudes


La API JSONPlaceHolder tiene muchos puntos finales diferentes que puede usar.


Obtener una lista de mensajes


 @GET("/posts") public Call<List<Post>> getAllPosts(); 

Para obtener una lista de todos los mensajes, cambiamos el punto final y el tipo de retorno de la función.


Envío de solicitud con parámetro


Si desea enviar una solicitud con un parámetro, solo necesita usar la anotación @Query() para el parámetro correspondiente en el método:


 @GET("/posts") public Call<List<Post>> getPostOfUser(@Query("userId") int id); 

Por lo tanto, si pasamos el valor 6 en el parámetro del método, entonces el punto final será el siguiente - /posts?userId=6 .


Enviar una solicitud POST


Para enviar una solicitud POST, solo necesita cambiar la anotación del método.


 @POST("/posts") public Call<Post> postData(@Body Post data); 

Para formar el cuerpo de solicitud para este método, usamos la anotación @Body para el parámetro pasado. Retrofit usará Gson para convertir @Body a JSON.


Hay varios tipos más diferentes de consultas que puede usar, pero este es un tema para un artículo separado.


Solicitar intercepción


La actualización proporciona una forma de interceptar solicitudes e iniciarlas en Logcat. Instalemos un interceptor y observemos esta magia. Agregue la siguiente dependencia al archivo build.gradle :


 implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0' 

Actualice la clase NetworkService esta manera:


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder client = new OkHttpClient.Builder() .addInterceptor(interceptor); mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client.build()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } } 

Ahora, cuando envíe o reciba una solicitud, se registrarán todos sus datos, incluidas las URL, los encabezados y el cuerpo:


 D/OkHttp: <-- 200 https://jsonplaceholder.typicode.com/posts/1 (3030ms) date: Tue, 24 Apr 2018 15:25:19 GMT content-type: application/json; charset=utf-8 set-cookie: __cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519; expires=Wed, 24-Apr-19 15:25:19 GMT; path=/; domain=.typicode.com; HttpOnly x-powered-by: Express vary: Origin, Accept-Encoding access-control-allow-credentials: true cache-control: public, max-age=14400 pragma: no-cache expires: Tue, 24 Apr 2018 19:25:19 GMT 04-24 15:25:16.204 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: x-content-type-options: nosniff etag: W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" via: 1.1 vegur cf-cache-status: HIT expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" server: cloudflare cf-ray: 410994f328963066-SIN 04-24 15:25:16.246 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: { 04-24 15:25:16.247 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } <-- END HTTP (292-byte body) 

Esto concluye nuestro artículo. Puede encontrar el código para este proyecto en GitHub .

Source: https://habr.com/ru/post/es429058/


All Articles