Bienvenido al maravilloso mundo de las Rest APIs en Flutter. En esta sección, aprenderemos cómo consultar Rest APIs para obtener datos de servidores externos y utilizarlos en nuestras aplicaciones Flutter. Este proceso es fundamental para cualquier aplicación que necesite acceder a información actualizada y en tiempo real. ¡Vamos a sumergirnos en ello!

Proceso de obtención de datos

La obtención de datos de internet es necesaria para la mayoría de las aplicaciones. Afortunadamente, Dart y Flutter proporcionan herramientas, como el paquete http, para este tipo de trabajo.

  1. Agregar el paquete http: Este paquete proporciona la forma más sencilla de obtener datos de internet. Para agregarlo como dependencia, se debe ejecutar el comando:
$ flutter pub add http

Después de esto, se debe importar el paquete http:

import 'package:http/http.dart' as http;

  1. Realizar una solicitud de red: Este proceso cubre cómo obtener un álbum de muestra de JSONPlaceholder usando el método http.get(). Este método devuelve un Future que contiene una Response.
Future<http.Response> fetchAlbum() {
  return http.get(Uri.parse('<https://jsonplaceholder.typicode.com/albums/1>'));
}

  1. Convertir la respuesta en un objeto Dart personalizado: Es fácil hacer una solicitud de red, pero trabajar con un Future<http.Response> en bruto no es muy conveniente. Para facilitar el trabajo, es recomendable convertir la http.Response en un objeto Dart. Para esto se crea una clase Album que contiene los datos de la solicitud de red. Esta clase incluye un constructor que crea un Album a partir de JSON.
class Album {
  final int userId;
  final int id;
  final String title;

  const Album({
    required this.userId,
    required this.id,
    required this.title,
  });

  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
    );
  }
}

  1. Convertir la http.Response en un Album: Ahora debes actualizar la función fetchAlbum() para que devuelva un Future<Album>. Para esto debes convertir el cuerpo de la respuesta en un Map JSON con el paquete dart:convert. Si el servidor devuelve una respuesta OK con un código de estado 200, entonces debes convertir el Map JSON en un Album utilizando el método de fábrica fromJson(). Si el servidor no devuelve una respuesta OK con un código de estado 200, entonces debes lanzar una excepción.
Future<Album> fetchAlbum() async {
  final response = await http.get(Uri.parse('<https://jsonplaceholder.typicode.com/albums/1>'));
  if (response.statusCode == 200) {
    return Album.fromJson(jsonDecode(response.body));
  } else {
    throw Exception('Failed to load album');
  }
}

Organicemos nuestra función fetchAlbum()

Errores

Nuestra función tiene puntos de mejora, uno de ellos es tener estandarizado los posibles tipos de errores y mapearlos en nuestra función como en el siguiente caso:

enum FetchAlbumError {
  notFound,
  serverError,
  unknown,
}

class FetchAlbumException implements Exception {
  final FetchAlbumError error;
  final String message;

  FetchAlbumException(this.error, this.message);

  @override
  String toString() => 'FetchAlbumException: $message';
}

El código proporcionado define un enumerado FetchAlbumError y una clase FetchAlbumException.

FetchAlbumError es un enumerado que consta de tres valores: notFound, serverError, unknown, que representan los diferentes tipos de errores que podrían ocurrir al buscar un álbum.