En aquest tema, aprendrem a obtenir dades d'una API externa utilitzant la Fetch API en React Native. La Fetch API és una interfície moderna que permet fer sol·licituds de xarxa de manera senzilla i eficient.
Objectius
- Comprendre com funciona la Fetch API.
- Aprendre a fer sol·licituds GET i POST.
- Gestionar les respostes de les sol·licituds.
- Manejar errors de xarxa.
- Introducció a la Fetch API
La Fetch API proporciona una manera fàcil i lògica de fer sol·licituds de xarxa asíncrones. És una alternativa moderna a l'antic XMLHttpRequest
.
Característiques clau:
- Basada en promeses.
- Suporta sol·licituds GET, POST, PUT, DELETE, etc.
- Permet gestionar respostes en format JSON, text, blob, etc.
- Sol·licitud GET amb Fetch API
Exemple bàsic
A continuació, es mostra un exemple bàsic de com fer una sol·licitud GET per obtenir dades d'una API:
import React, { useEffect, useState } from 'react'; import { View, Text, ActivityIndicator, StyleSheet } from 'react-native'; const FetchExample = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch('https://jsonplaceholder.typicode.com/posts/1') .then((response) => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then((data) => { setData(data); setLoading(false); }) .catch((error) => { setError(error); setLoading(false); }); }, []); if (loading) { return <ActivityIndicator size="large" color="#0000ff" />; } if (error) { return ( <View style={styles.container}> <Text>Error: {error.message}</Text> </View> ); } return ( <View style={styles.container}> <Text>{data.title}</Text> <Text>{data.body}</Text> </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, }); export default FetchExample;
Explicació del codi
-
Importacions i estat inicial:
- Importem els components necessaris de React i React Native.
- Definim tres estats:
data
per emmagatzemar les dades obtingudes,loading
per gestionar l'estat de càrrega ierror
per gestionar els errors.
-
useEffect:
- Utilitzem
useEffect
per fer la sol·licitud GET quan el component es munta. fetch
fa la sol·licitud a l'URL especificada.- Si la resposta no és correcta (
response.ok
), es llança un error. - Si la resposta és correcta, es converteix a JSON i es guarda a l'estat
data
. - Si hi ha un error, es guarda a l'estat
error
.
- Utilitzem
-
Renderització condicional:
- Si
loading
és cert, es mostra un indicador de càrrega. - Si hi ha un
error
, es mostra un missatge d'error. - Si les dades s'han carregat correctament, es mostren les dades.
- Si
- Sol·licitud POST amb Fetch API
Exemple bàsic
A continuació, es mostra un exemple de com fer una sol·licitud POST per enviar dades a una API:
import React, { useState } from 'react'; import { View, Text, Button, StyleSheet } from 'react-native'; const PostExample = () => { const [response, setResponse] = useState(null); const postData = () => { fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ title: 'foo', body: 'bar', userId: 1, }), }) .then((response) => response.json()) .then((data) => { setResponse(data); }) .catch((error) => { console.error('Error:', error); }); }; return ( <View style={styles.container}> <Button title="Enviar dades" onPress={postData} /> {response && ( <View> <Text>ID: {response.id}</Text> <Text>Title: {response.title}</Text> <Text>Body: {response.body}</Text> </View> )} </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, }); export default PostExample;
Explicació del codi
-
Importacions i estat inicial:
- Importem els components necessaris de React i React Native.
- Definim un estat
response
per emmagatzemar la resposta de la sol·licitud POST.
-
postData:
- Definim la funció
postData
que es crida quan es prem el botó. fetch
fa la sol·licitud POST a l'URL especificada.- Es defineixen els
headers
i elbody
de la sol·licitud. - Si la sol·licitud és correcta, es converteix a JSON i es guarda a l'estat
response
. - Si hi ha un error, es mostra a la consola.
- Definim la funció
-
Renderització:
- Es mostra un botó que crida la funció
postData
quan es prem. - Si hi ha una resposta, es mostren les dades de la resposta.
- Es mostra un botó que crida la funció
- Gestió d'errors de xarxa
És important gestionar els errors de xarxa per proporcionar una millor experiència d'usuari. A continuació, es mostra com gestionar errors en una sol·licitud GET:
useEffect(() => { fetch('https://jsonplaceholder.typicode.com/posts/1') .then((response) => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then((data) => { setData(data); setLoading(false); }) .catch((error) => { setError(error); setLoading(false); }); }, []);
Consells per gestionar errors:
- Utilitza
try...catch
per gestionar errors de manera més clara. - Proporciona missatges d'error útils per a l'usuari.
- Considera la possibilitat de tornar a intentar la sol·licitud en cas d'error.
Exercici pràctic
Exercici
Crea una aplicació que faci una sol·licitud GET a l'API https://jsonplaceholder.typicode.com/users
i mostri una llista de noms d'usuaris.
Solució
import React, { useEffect, useState } from 'react'; import { View, Text, FlatList, ActivityIndicator, StyleSheet } from 'react-native'; const UsersList = () => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch('https://jsonplaceholder.typicode.com/users') .then((response) => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then((data) => { setUsers(data); setLoading(false); }) .catch((error) => { setError(error); setLoading(false); }); }, []); if (loading) { return <ActivityIndicator size="large" color="#0000ff" />; } if (error) { return ( <View style={styles.container}> <Text>Error: {error.message}</Text> </View> ); } return ( <View style={styles.container}> <FlatList data={users} keyExtractor={(item) => item.id.toString()} renderItem={({ item }) => <Text>{item.name}</Text>} /> </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, }); export default UsersList;
Explicació de la solució
-
Importacions i estat inicial:
- Importem els components necessaris de React i React Native.
- Definim tres estats:
users
per emmagatzemar la llista d'usuaris,loading
per gestionar l'estat de càrrega ierror
per gestionar els errors.
-
useEffect:
- Utilitzem
useEffect
per fer la sol·licitud GET quan el component es munta. fetch
fa la sol·licitud a l'URL especificada.- Si la resposta no és correcta (
response.ok
), es llança un error. - Si la resposta és correcta, es converteix a JSON i es guarda a l'estat
users
. - Si hi ha un error, es guarda a l'estat
error
.
- Utilitzem
-
Renderització condicional:
- Si
loading
és cert, es mostra un indicador de càrrega. - Si hi ha un
error
, es mostra un missatge d'error. - Si les dades s'han carregat correctament, es mostra una llista d'usuaris utilitzant
FlatList
.
- Si
Conclusió
En aquest tema, hem après a utilitzar la Fetch API per obtenir dades d'una API externa en React Native. Hem vist com fer sol·licituds GET i POST, gestionar respostes i errors de xarxa. També hem practicat aquests conceptes amb un exercici pràctic. Ara estem preparats per avançar cap a la gestió d'errors de xarxa en més profunditat i altres tècniques de sol·licitud de dades.
Curs de React Native
Mòdul 1: Introducció a React Native
- Què és React Native?
- Configuració de l'entorn de desenvolupament
- Aplicació Hello World
- Comprendre JSX
- Components i Props
Mòdul 2: Components bàsics i estilització
- Visió general dels components bàsics
- Text, View i Image
- Estilització amb Flexbox
- Gestió de l'entrada de l'usuari
- ScrollView i ListView
Mòdul 3: Estat i cicle de vida
- Mètodes d'estat i cicle de vida
- Gestió d'esdeveniments
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Navegació
- Introducció a React Navigation
- Stack Navigator
- Tab Navigator
- Drawer Navigator
- Passar paràmetres a les rutes
Mòdul 5: Xarxes i dades
- Obtenir dades amb Fetch API
- Utilitzar Axios per a sol·licituds HTTP
- Gestió d'errors de xarxa
- AsyncStorage per a dades locals
- Integració amb APIs REST
Mòdul 6: Conceptes avançats
Mòdul 7: Desplegament i publicació
- Construcció per a iOS
- Construcció per a Android
- Publicació a l'App Store
- Publicació a Google Play
- Integració i lliurament continus