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:
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.axios.get
fa la sol·licitud i, si té èxit, actualitzadata
iloading
. Si hi ha un error, actualitzaerror
iloading
. - 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:
title
ibody
per emmagatzemar les dades del formulari, iresponse
per 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
, iuserId
al servidor. Si la sol·licitud té èxit, actualitzaresponse
amb les dades de la resposta. - Renderització: Mostrem dos
TextInput
per recollirtitle
ibody
, unButton
per 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.response
per obtenir més informació sobre l'error. - error.request: Si la sol·licitud es va fer però no es va rebre cap resposta,
error.request
contindrà 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.message
contindrà el missatge d'error. - error.config:
error.config
conté 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