En aquest tema, aprendrem com integrar APIs REST en una aplicació Flutter per obtenir i enviar dades a un servidor. Les APIs REST són una manera estàndard de comunicar-se amb serveis web i són àmpliament utilitzades en el desenvolupament d'aplicacions mòbils.
Objectius
- Comprendre què és una API REST.
- Aprendre a fer sol·licituds HTTP en Flutter.
- Gestionar respostes i errors de les sol·licituds HTTP.
- Analitzar dades JSON obtingudes d'una API REST.
Què és una API REST?
Una API REST (Representational State Transfer) és un conjunt de regles que permeten la interacció entre clients i servidors a través del protocol HTTP. Les operacions principals són:
- GET: Obtenir dades del servidor.
- POST: Enviar dades al servidor.
- PUT: Actualitzar dades al servidor.
- DELETE: Eliminar dades del servidor.
Configuració Prèvia
Abans de començar, assegura't d'haver afegit el paquet http
al teu projecte Flutter. Pots fer-ho afegint la següent línia al fitxer pubspec.yaml
:
Després, executa flutter pub get
per instal·lar el paquet.
Fer Sol·licituds HTTP
Sol·licitud GET
A continuació, es mostra com fer una sol·licitud GET per obtenir dades d'una API REST:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<void> fetchData() async { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts')); if (response.statusCode == 200) { List<dynamic> data = jsonDecode(response.body); print(data); } else { throw Exception('Failed to load data'); } }
Explicació del Codi
- Importacions: Importem el paquet
http
idart:convert
per treballar amb sol·licituds HTTP i dades JSON. - http.get: Fa una sol·licitud GET a l'URL especificada.
- response.statusCode: Comprova si la sol·licitud ha estat exitosa (codi 200).
- jsonDecode: Converteix la resposta JSON en una llista de mapes.
Sol·licitud POST
Per enviar dades a una API REST, utilitzem una sol·licitud POST:
Future<void> postData() async { final response = await http.post( Uri.parse('https://jsonplaceholder.typicode.com/posts'), headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonEncode(<String, String>{ 'title': 'foo', 'body': 'bar', 'userId': '1', }), ); if (response.statusCode == 201) { print('Data posted successfully'); } else { throw Exception('Failed to post data'); } }
Explicació del Codi
- http.post: Fa una sol·licitud POST a l'URL especificada.
- headers: Defineix el tipus de contingut com a JSON.
- jsonEncode: Converteix les dades en format JSON.
Gestió d'Errors
És important gestionar els errors que poden ocórrer durant les sol·licituds HTTP. Aquí tens un exemple de com fer-ho:
Future<void> fetchDataWithErrorHandling() async { try { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts')); if (response.statusCode == 200) { List<dynamic> data = jsonDecode(response.body); print(data); } else { print('Failed to load data: ${response.statusCode}'); } } catch (e) { print('An error occurred: $e'); } }
Exercici Pràctic
Exercici
Crea una aplicació Flutter que faci una sol·licitud GET a l'API https://jsonplaceholder.typicode.com/posts
i mostri els títols dels posts en una llista.
Solució
import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('API REST Example'), ), body: PostList(), ), ); } } class PostList extends StatefulWidget { @override _PostListState createState() => _PostListState(); } class _PostListState extends State<PostList> { List<dynamic> posts = []; @override void initState() { super.initState(); fetchPosts(); } Future<void> fetchPosts() async { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts')); if (response.statusCode == 200) { setState(() { posts = jsonDecode(response.body); }); } else { throw Exception('Failed to load posts'); } } @override Widget build(BuildContext context) { return ListView.builder( itemCount: posts.length, itemBuilder: (context, index) { return ListTile( title: Text(posts[index]['title']), ); }, ); } }
Explicació del Codi
- PostList: Un widget que mostra una llista de posts.
- fetchPosts: Fa una sol·licitud GET per obtenir els posts i actualitza l'estat del widget.
- ListView.builder: Crea una llista dinàmica de widgets
ListTile
per mostrar els títols dels posts.
Conclusió
En aquest tema, hem après com fer sol·licituds GET i POST a APIs REST utilitzant el paquet http
en Flutter. També hem vist com gestionar errors i analitzar dades JSON. Amb aquests coneixements, pots començar a integrar APIs REST en les teves aplicacions Flutter per obtenir i enviar dades de manera eficient.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
- Configuració de l'Entorn de Desenvolupament
- Comprensió de l'Arquitectura de Flutter
- Creació de la Teva Primera Aplicació Flutter
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
- Variables i Tipus de Dades
- Sentències de Flux de Control
- Funcions i Mètodes
- Programació Orientada a Objectes en Dart
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
- Widgets Stateless vs Stateful
- Widgets Bàsics
- Widgets de Disseny
- Widgets d'Entrada i Formulari
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
- Navegació Bàsica
- Rutes Nomenades
- Passar Dades Entre Pantalles
- Deep Linking
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
- Analitzar Dades JSON
- Gestió d'Errors de Xarxa
- Ús d'APIs REST
- Integració de GraphQL
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
- Preferències Compartides
- Emmagatzematge de Fitxers
- Base de Dades SQLite
- Ús de Hive per a l'Emmagatzematge Local
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
- Pintura Personalitzada i Canvas
- Canals de Plataforma
- Isolates i Concurrència
- Optimització del Rendiment
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries
- Proves de Widgets
- Proves d'Integració
- Tècniques de Depuració
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
- Construcció per a iOS
- Construcció per a Android
- Integració i Desplegament Continu (CI/CD)
- Manteniment i Actualització de la Teva Aplicació