En este módulo, aprenderemos cómo manejar la conectividad de red en aplicaciones Android. La capacidad de interactuar con servicios web y APIs es fundamental para muchas aplicaciones modernas. Cubriremos conceptos básicos y avanzados, desde realizar solicitudes HTTP hasta manejar respuestas JSON y XML.

Contenidos

  1. Introducción a la conectividad de red en Android
  2. Realizando solicitudes HTTP con HttpURLConnection
  3. Usando Retrofit para simplificar las solicitudes de red
  4. Manejo de respuestas JSON y XML
  5. Buenas prácticas y manejo de errores

  1. Introducción a la conectividad de red en Android

Android proporciona varias formas de realizar operaciones de red. Las más comunes son:

  • HttpURLConnection: Una clase de Java estándar para realizar solicitudes HTTP.
  • Retrofit: Una biblioteca de terceros que simplifica las solicitudes HTTP y el manejo de respuestas.

Conceptos clave

  • API REST: Un conjunto de reglas que permiten la interacción con servicios web.
  • JSON: Un formato de datos ligero y fácil de leer para el intercambio de datos.
  • XML: Un formato de datos más antiguo y más verboso que JSON.

  1. Realizando solicitudes HTTP con HttpURLConnection

Ejemplo práctico

Vamos a realizar una solicitud GET a una API pública que devuelve datos en formato JSON.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NetworkUtils {

    public static String getResponseFromHttpUrl(URL url) throws IOException {
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        try {
            InputStream in = urlConnection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }
            return result.toString();
        } finally {
            urlConnection.disconnect();
        }
    }
}

Explicación del código

  1. Abrir una conexión: HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
  2. Leer la respuesta: Utilizamos BufferedReader para leer la respuesta línea por línea.
  3. Cerrar la conexión: urlConnection.disconnect(); asegura que la conexión se cierre correctamente.

  1. Usando Retrofit para simplificar las solicitudes de red

Retrofit es una biblioteca de terceros que facilita las solicitudes HTTP y el manejo de respuestas. Es especialmente útil para trabajar con APIs RESTful.

Configuración de Retrofit

  1. Agregar la dependencia en build.gradle:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  1. Definir una interfaz para la API:
import retrofit2.Call;
import retrofit2.http.GET;

public interface ApiService {
    @GET("path/to/endpoint")
    Call<List<MyDataModel>> getData();
}
  1. Configurar Retrofit en tu aplicación:
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

Realizar una solicitud con Retrofit

Retrofit retrofit = RetrofitClient.getClient("https://api.example.com/");
ApiService apiService = retrofit.create(ApiService.class);

Call<List<MyDataModel>> call = apiService.getData();
call.enqueue(new Callback<List<MyDataModel>>() {
    @Override
    public void onResponse(Call<List<MyDataModel>> call, Response<List<MyDataModel>> response) {
        if (response.isSuccessful()) {
            List<MyDataModel> data = response.body();
            // Manejar los datos recibidos
        }
    }

    @Override
    public void onFailure(Call<List<MyDataModel>> call, Throwable t) {
        // Manejar el error
    }
});

  1. Manejo de respuestas JSON y XML

JSON

Retrofit puede convertir automáticamente las respuestas JSON en objetos Java utilizando Gson.

import com.google.gson.annotations.SerializedName;

public class MyDataModel {
    @SerializedName("id")
    private int id;

    @SerializedName("name")
    private String name;

    // Getters y Setters
}

XML

Para manejar respuestas XML, puedes usar un convertidor como Simple XML.

implementation 'com.squareup.retrofit2:converter-simplexml:2.9.0'

  1. Buenas prácticas y manejo de errores

  • Manejo de errores: Siempre maneja los errores de red adecuadamente para mejorar la experiencia del usuario.
  • Operaciones en segundo plano: Realiza las operaciones de red en un hilo separado para no bloquear la interfaz de usuario.
  • Seguridad: Asegúrate de usar HTTPS para proteger los datos transmitidos.

Ejercicio práctico

Objetivo: Realizar una solicitud GET a una API pública y mostrar los datos en un RecyclerView.

  1. Configura Retrofit.
  2. Define la interfaz de la API.
  3. Realiza la solicitud y maneja la respuesta.
  4. Muestra los datos en un RecyclerView.

Solución

  1. Configura Retrofit (ver sección anterior).
  2. Define la interfaz de la API:
public interface ApiService {
    @GET("users")
    Call<List<User>> getUsers();
}
  1. Realiza la solicitud y maneja la respuesta:
Call<List<User>> call = apiService.getUsers();
call.enqueue(new Callback<List<User>>() {
    @Override
    public void onResponse(Call<List<User>> call, Response<List<User>> response) {
        if (response.isSuccessful()) {
            List<User> users = response.body();
            // Actualiza el RecyclerView con los datos
        }
    }

    @Override
    public void onFailure(Call<List<User>> call, Throwable t) {
        // Maneja el error
    }
});
  1. Muestra los datos en un RecyclerView:
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {
    private List<User> userList;

    public UserAdapter(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item, parent, false);
        return new UserViewHolder(view);
    }

    @Override
    public void onBindViewHolder(UserViewHolder holder, int position) {
        User user = userList.get(position);
        holder.nameTextView.setText(user.getName());
    }

    @Override
    public int getItemCount() {
        return userList.size();
    }

    public class UserViewHolder extends RecyclerView.ViewHolder {
        public TextView nameTextView;

        public UserViewHolder(View itemView) {
            super(itemView);
            nameTextView = itemView.findViewById(R.id.nameTextView);
        }
    }
}

Conclusión

En esta sección, hemos aprendido cómo manejar la conectividad de red en Android utilizando HttpURLConnection y Retrofit. También hemos visto cómo manejar respuestas JSON y XML, y hemos discutido algunas buenas prácticas para el manejo de errores y la seguridad. Con estos conocimientos, estarás preparado para integrar servicios web y APIs en tus aplicaciones Android.

© Copyright 2024. Todos los derechos reservados