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:
dataper emmagatzemar les dades obtingudes,loadingper gestionar l'estat de càrrega ierrorper gestionar els errors.
-
useEffect:
- Utilitzem
useEffectper fer la sol·licitud GET quan el component es munta. fetchfa 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
responseper emmagatzemar la resposta de la sol·licitud POST.
-
postData:
- Definim la funció
postDataque es crida quan es prem el botó. fetchfa la sol·licitud POST a l'URL especificada.- Es defineixen els
headersi elbodyde 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ó
postDataquan 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...catchper 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:
usersper emmagatzemar la llista d'usuaris,loadingper gestionar l'estat de càrrega ierrorper gestionar els errors.
-
useEffect:
- Utilitzem
useEffectper fer la sol·licitud GET quan el component es munta. fetchfa 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
