Saltar al contenido principal

Obtener datos de internet

Instrucciones sobre cómo realizar solicitudes HTTP y analizar respuestas.

Aprende el patrón de arquitectura MVVM y cómo construir solicitudes HTTP con async/await.

Qué lograrás

Entender el patrón de arquitectura MVVM
Construir solicitudes HTTP con async/await
Manejar errores y analizar respuestas JSON

Pasos

1

Introducción

El patrón general que implementa este tutorial se llama Model-View-ViewModel o MVVM. MVVM es un patrón de arquitectura utilizado en aplicaciones cliente que separa tu aplicación en tres capas:

  • Model: Maneja las operaciones de datos.
  • View: Muestra la interfaz de usuario.
  • ViewModel: Administra el State y conecta ambos.

El principio fundamental de MVVM (y muchos otros patrones) es la separación de responsabilidades. Administrar el State en clases separadas (fuera de tus Widgets de interfaz de usuario) hace que tu código sea más fácil de probar, reutilizar y mantener.

Una sola funcionalidad en tu aplicación contiene cada uno de los componentes de MVVM. En este tutorial, además de los Widgets de Flutter, crearás ArticleModel, ArticleViewModel y ArticleView.

2

Definir el Model

El Model es la fuente de verdad para los datos de tu aplicación y es responsable de tareas de bajo nivel como realizar solicitudes HTTP, almacenar datos en caché o administrar recursos del sistema como los utilizados por un plugin de Flutter. Un modelo no suele necesitar importar librerías de Flutter.

Crea una clase ArticleModel vacía en tu archivo main.dart:

dart
class ArticleModel {
  // Properties and methods will be added here.
}
3

Construir la solicitud HTTP

Wikipedia proporciona una API REST que devuelve datos JSON sobre artículos. Para esta aplicación, usarás el endpoint que devuelve un resumen de artículo aleatorio.

https://en.wikipedia.org/api/rest_v1/page/random/summary

Añade un método para obtener un resumen de artículo de Wikipedia aleatorio:

dart
class ArticleModel {
  Future<Summary> getRandomArticleSummary() async {
    final uri = Uri.https(
      'en.wikipedia.org',
      '/api/rest_v1/page/random/summary',
    );
    final response = await get(uri);

    // TODO: Add error handling and JSON parsing.
    throw UnimplementedError();
  }
}

Usa las palabras clave async y await para manejar operaciones asíncronas. La palabra clave async marca un método como asíncrono, y await espera expresiones que devuelven un Future.

El constructor Uri.https construye URLs de forma segura al manejar la codificación y el formato. Este enfoque es más confiable que la concatenación de cadenas, especialmente cuando se trabaja con caracteres especiales o parámetros de consulta.

4

Manejar errores de red

Maneja siempre los errores al realizar solicitudes HTTP. Un código de estado de 200 indica éxito, mientras que otros códigos indican errores. Si el código de estado no es 200, el modelo lanza un error para que la interfaz de usuario lo muestre a los usuarios.

dart
class ArticleModel {
  Future<Summary> getRandomArticleSummary() async {
    final uri = Uri.https(
      'en.wikipedia.org',
      '/api/rest_v1/page/random/summary',
    );
    final response = await get(uri);

    if (response.statusCode != 200) {
      throw const HttpException('Failed to update resource');
    }

    // TODO: Parse JSON and return Summary.
    throw UnimplementedError();
  }
}
5

Analizar JSON de Wikipedia

La API de Wikipedia devuelve datos JSON que decodificas en una clase Summary Completa el método getRandomArticleSummary:

dart
class ArticleModel {
  Future<Summary> getRandomArticleSummary() async {
    final uri = Uri.https(
      'en.wikipedia.org',
      '/api/rest_v1/page/random/summary',
    );
    final response = await get(uri);

    if (response.statusCode != 200) {
      throw const HttpException('Failed to update resource');
    }

    return Summary.fromJson(jsonDecode(response.body) as Map<String, Object?>);
  }
}

La clase Summary está definida en summary.dart. Si no estás familiarizado con el análisis de JSON, consulta el tutorial Primeros pasos con Dart.

6

Revisión

Qué lograste

Aquí tienes un resumen de lo que construiste y aprendiste en esta lección.
Entendí el patrón de arquitectura MVVM

MVVM separa tu aplicación en Model (operaciones de datos), View (interfaz de usuario) y ViewModel (administración del State). Esta separación de responsabilidades hace que tu código sea más fácil de probar, reutilizar y mantener.

Construiste una solicitud HTTP para obtener datos de Wikipedia

Creaste una clase ArticleModel con un método que utiliza async y await para obtener datos de la API de Wikipedia. Para construir de forma segura las URLs de las solicitudes, utilizaste el constructor Uri.https que maneja la codificación y los caracteres especiales por ti.

Manejaste errores y analizaste respuestas JSON

Verificaste el código de estado HTTP para detectar errores y utilizaste jsonDecode para analizar el cuerpo de la respuesta. Luego, para convertir el JSON sin formato en un objeto Dart con tipo, usaste el constructor con nombre Summary.fromJson.

7

Ponte a prueba

Quiz de solicitudes HTTP

1 / 2
What do the async and await keywords do in Dart?
  1. Hacen que el código se ejecute en un hilo separado.

    No exactamente.

    Dart es de un solo hilo; async/await maneja operaciones asíncronas sin hilos.

  2. Convierten el código síncrono para que se ejecute en segundo plano.

    No exactamente.

    No mueven el código al segundo plano; administran el flujo de ejecución asíncrona.

  3. Marcan una función como asíncrona y pausan la ejecución hasta que un Future se complete.

    ¡Así es!

    La palabra clave async marca una función como asíncrona, y await pausa la ejecución hasta que se resuelva el Future.

  4. Almacenan automáticamente en caché los resultados de las llamadas a funciones.

    No exactamente.

    El almacenamiento en caché requiere una implementación separada; async/await es para manejar operaciones asíncronas.

Why is Uri.https preferred over string concatenation when building URLs in Dart?
  1. Valida automáticamente que la URL exista.

    No exactamente.

    Uri.https construye la URL; no verifica si el endpoint existe.

  2. Es requerido por el paquete http.

    No exactamente.

    Puedes usar cadenas, pero Uri.https es más seguro y confiable.

  3. Maneja de forma segura la codificación y el formato, especialmente para caracteres especiales y parámetros de consulta.

    ¡Así es!

    Uri.https codifica adecuadamente los caracteres especiales y da formato a las URLs, previniendo errores comunes.

  4. Hace que el código sea más corto.

    No exactamente.

    La longitud del código no es el beneficio principal; la codificación adecuada lo es.