En aquest tema, aprendrem a utilitzar Axios per fer sol·licituds HTTP en una aplicació React Native. Axios és una llibreria basada en promeses que facilita la realització de sol·licituds HTTP asíncrones. És una alternativa popular a la Fetch API, ja que ofereix una sintaxi més senzilla i funcionalitats addicionals.
Continguts
Instal·lació d'Axios
Per començar a utilitzar Axios, primer hem d'instal·lar la llibreria en el nostre projecte React Native. Utilitzarem npm o yarn per fer-ho.
o
Realitzar una sol·licitud GET
Una de les operacions més comunes és obtenir dades d'un servidor. Vegem com fer una sol·licitud GET amb Axios.
Exemple de codi
import React, { useEffect, useState } from 'react';
import { View, Text, ActivityIndicator, StyleSheet } from 'react-native';
import axios from 'axios';
const App = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
axios.get('https://jsonplaceholder.typicode.com/posts/1')
.then(response => {
setData(response.data);
setLoading(false);
})
.catch(error => {
setError(error);
setLoading(false);
});
}, []);
if (loading) {
return <ActivityIndicator size="large" color="#0000ff" />;
}
if (error) {
return <Text>Error: {error.message}</Text>;
}
return (
<View style={styles.container}>
<Text style={styles.title}>{data.title}</Text>
<Text>{data.body}</Text>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 10,
},
});
export default App;Explicació del codi
- Importacions: Importem
React,useEffect,useState, i components de React Native comView,Text,ActivityIndicator, iStyleSheet. També importemaxios. - Estat: 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.axios.getfa la sol·licitud i, si té èxit, actualitzadatailoading. Si hi ha un error, actualitzaerroriloading. - Renderització condicional: Mentre
loadingéstrue, mostrem unActivityIndicator. Si hi ha un error, mostrem un missatge d'error. Si tot va bé, mostrem les dades obtingudes.
Realitzar una sol·licitud POST
Les sol·licituds POST s'utilitzen per enviar dades a un servidor. Vegem com fer una sol·licitud POST amb Axios.
Exemple de codi
import React, { useState } from 'react';
import { View, Text, TextInput, Button, StyleSheet } from 'react-native';
import axios from 'axios';
const App = () => {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
const [response, setResponse] = useState(null);
const handleSubmit = () => {
axios.post('https://jsonplaceholder.typicode.com/posts', {
title: title,
body: body,
userId: 1,
})
.then(response => {
setResponse(response.data);
})
.catch(error => {
console.error(error);
});
};
return (
<View style={styles.container}>
<TextInput
style={styles.input}
placeholder="Title"
value={title}
onChangeText={setTitle}
/>
<TextInput
style={styles.input}
placeholder="Body"
value={body}
onChangeText={setBody}
/>
<Button title="Submit" onPress={handleSubmit} />
{response && (
<View style={styles.responseContainer}>
<Text style={styles.responseTitle}>Response:</Text>
<Text>{JSON.stringify(response, null, 2)}</Text>
</View>
)}
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
padding: 20,
},
input: {
height: 40,
borderColor: 'gray',
borderWidth: 1,
marginBottom: 10,
padding: 10,
},
responseContainer: {
marginTop: 20,
},
responseTitle: {
fontSize: 18,
fontWeight: 'bold',
},
});
export default App;Explicació del codi
- Estat: Definim tres estats:
titleibodyper emmagatzemar les dades del formulari, iresponseper emmagatzemar la resposta del servidor. - handleSubmit: Aquesta funció es crida quan l'usuari prem el botó "Submit". Fa una sol·licitud POST amb
axios.post, envianttitle,body, iuserIdal servidor. Si la sol·licitud té èxit, actualitzaresponseamb les dades de la resposta. - Renderització: Mostrem dos
TextInputper recollirtitleibody, unButtonper enviar les dades, i, si hi ha una resposta, la mostrem en unView.
Gestió d'errors
És important gestionar els errors quan es fan sol·licituds HTTP. Vegem com fer-ho amb Axios.
Exemple de codi
axios.get('https://jsonplaceholder.typicode.com/posts/1')
.then(response => {
console.log(response.data);
})
.catch(error => {
if (error.response) {
// El servidor va respondre amb un codi d'estat fora del rang 2xx
console.error('Error data:', error.response.data);
console.error('Error status:', error.response.status);
console.error('Error headers:', error.response.headers);
} else if (error.request) {
// La sol·licitud es va fer però no es va rebre cap resposta
console.error('Error request:', error.request);
} else {
// Alguna cosa va passar en configurar la sol·licitud que va provocar un error
console.error('Error message:', error.message);
}
console.error('Error config:', error.config);
});Explicació del codi
- error.response: Si el servidor respon amb un codi d'estat fora del rang 2xx, podem accedir a
error.responseper obtenir més informació sobre l'error. - error.request: Si la sol·licitud es va fer però no es va rebre cap resposta,
error.requestcontindrà la sol·licitud que es va fer. - error.message: Si alguna cosa va passar en configurar la sol·licitud que va provocar un error,
error.messagecontindrà el missatge d'error. - error.config:
error.configconté la configuració de la sol·licitud que es va fer.
Exercicis pràctics
Exercici 1: Sol·licitud GET
Crea una aplicació que faci una sol·licitud GET a l'API de JSONPlaceholder per obtenir una llista de publicacions i mostri els títols en una llista.
Exercici 2: Sol·licitud POST
Crea una aplicació que permeti a l'usuari enviar una nova publicació a l'API de JSONPlaceholder mitjançant una sol·licitud POST. Mostra la resposta del servidor a l'usuari.
Solucions
Solució Exercici 1
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList, ActivityIndicator, StyleSheet } from 'react-native';
import axios from 'axios';
const App = () => {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => {
setData(response.data);
setLoading(false);
})
.catch(error => {
setError(error);
setLoading(false);
});
}, []);
if (loading) {
return <ActivityIndicator size="large" color="#0000ff" />;
}
if (error) {
return <Text>Error: {error.message}</Text>;
}
return (
<View style={styles.container}>
<FlatList
data={data}
keyExtractor={item => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.item}>
<Text style={styles.title}>{item.title}</Text>
</View>
)}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
padding: 20,
},
item: {
padding: 10,
borderBottomWidth: 1,
borderBottomColor: '#ccc',
},
title: {
fontSize: 18,
},
});
export default App;Solució Exercici 2
import React, { useState } from 'react';
import { View, Text, TextInput, Button, StyleSheet } from 'react-native';
import axios from 'axios';
const App = () => {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
const [response, setResponse] = useState(null);
const handleSubmit = () => {
axios.post('https://jsonplaceholder.typicode.com/posts', {
title: title,
body: body,
userId: 1,
})
.then(response => {
setResponse(response.data);
})
.catch(error => {
console.error(error);
});
};
return (
<View style={styles.container}>
<TextInput
style={styles.input}
placeholder="Title"
value={title}
onChangeText={setTitle}
/>
<TextInput
style={styles.input}
placeholder="Body"
value={body}
onChangeText={setBody}
/>
<Button title="Submit" onPress={handleSubmit} />
{response && (
<View style={styles.responseContainer}>
<Text style={styles.responseTitle}>Response:</Text>
<Text>{JSON.stringify(response, null, 2)}</Text>
</View>
)}
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
padding: 20,
},
input: {
height: 40,
borderColor: 'gray',
borderWidth: 1,
marginBottom: 10,
padding: 10,
},
responseContainer: {
marginTop: 20,
},
responseTitle: {
fontSize: 18,
fontWeight: 'bold',
},
});
export default App;Conclusió
En aquest tema, hem après a utilitzar Axios per fer sol·licituds HTTP en una aplicació React Native. Hem vist com fer sol·licituds GET i POST, com gestionar errors i hem practicat amb exercicis pràctics. Ara estem preparats per integrar Axios en les nostres aplicacions per gestionar la comunicació amb APIs de manera eficient.
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
