Fetch API & Axios
Learn to use Fetch API and Axios for making HTTP requests in React Native applications, understanding their differences and use cases. This is a foundational concept in cross-platform mobile development that professional developers rely on daily. The explanations below are written to be beginner-friendly while covering the depth and nuance that comes from real-world React Native experience. Take your time with each section and practice the examples
Fetch API
Fetch API is a modern, promise-based API for making HTTP requests. It's built into React Native and provides a clean, simple interface for network requests.. This is an essential concept that every React Native developer must understand thoroughly. In professional development environments, getting this right can mean the difference between code that works reliably and code that breaks in production. The following sections break this down into clear, digestible pieces with practical examples you can try immediately
Axios Library
Axios is a popular HTTP client library that provides more features than Fetch, including automatic JSON parsing, request/response interceptors, and better error handling.. This is an essential concept that every React Native developer must understand thoroughly. In professional development environments, getting this right can mean the difference between code that works reliably and code that breaks in production. The following sections break this down into clear, digestible pieces with practical examples you can try immediately
Installing Axios
Install Axios: `npm install axios`. Axios works out of the box with React Native and provides better TypeScript support and more features than Fetch.. This is an essential concept that every React Native developer must understand thoroughly. In professional development environments, getting this right can mean the difference between code that works reliably and code that breaks in production. The following sections break this down into clear, digestible pieces with practical examples you can try immediately
API Integration Example
import React, { useState, useEffect } from 'react';
import { View, Text, TouchableOpacity, StyleSheet, FlatList, ActivityIndicator, Alert } from 'react-native';
import axios from 'axios';
// API Configuration
const API_BASE_URL = 'https://jsonplaceholder.typicode.com';
// API Service
const apiService = {
// Fetch API example
fetchUsers: async () => {
try {
const response = await fetch(`${API_BASE_URL}/users`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Fetch error:', error);
throw error;
}
},
// Axios example
fetchPosts: async () => {
try {
const response = await axios.get(`${API_BASE_URL}/posts`);
return response.data;
} catch (error) {
console.error('Axios error:', error);
throw error;
}
},
// POST request with Axios
createPost: async (postData) => {
try {
const response = await axios.post(`${API_BASE_URL}/posts`, postData, {
headers: {
'Content-Type': 'application/json',
},
});
return response.data;
} catch (error) {
console.error('Create post error:', error);
throw error;
}
},
// PUT request with Axios
updatePost: async (id, postData) => {
try {
const response = await axios.put(`${API_BASE_URL}/posts/${id}`, postData);
return response.data;
} catch (error) {
console.error('Update post error:', error);
throw error;
}
},
// DELETE request with Axios
deletePost: async (id) => {
try {
const response = await axios.delete(`${API_BASE_URL}/posts/${id}`);
return response.data;
} catch (error) {
console.error('Delete post error:', error);
throw error;
}
},
};
// User Component
const UserList = () => {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const loadUsers = async () => {
setLoading(true);
setError(null);
try {
const userData = await apiService.fetchUsers();
setUsers(userData);
} catch (err) {
setError(err.message);
Alert.alert('Error', 'Failed to load users');
} finally {
setLoading(false);
}
};
useEffect(() => {
loadUsers();
}, []);
const renderUser = ({ item }) => (
<View style={styles.userItem}>
<Text style={styles.userName}>{item.name}</Text>
<Text style={styles.userEmail}>{item.email}</Text>
<Text style={styles.userWebsite}>{item.website}</Text>
</View>
);
return (
<View style={styles.section}>
<Text style={styles.sectionTitle}>Users (Fetch API)</Text>
{loading && <ActivityIndicator size="large" color="#2196F3" />}
{error && (
<View style={styles.errorContainer}>
<Text style={styles.errorText}>{error}</Text>
<TouchableOpacity style={styles.retryButton} onPress={loadUsers}>
<Text style={styles.retryButtonText}>Retry</Text>
</TouchableOpacity>
</View>
)}
<FlatList
data={users}
keyExtractor={item => item.id.toString()}
renderItem={renderUser}
style={styles.list}
refreshing={loading}
onRefresh={loadUsers}
/>
</View>
);
};
// Posts Component
const PostList = () => {
const [posts, setPosts] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const loadPosts = async () => {
setLoading(true);
setError(null);
try {
const postData = await apiService.fetchPosts();
setPosts(postData.slice(0, 10)); // Limit to first 10 posts
} catch (err) {
setError(err.message);
Alert.alert('Error', 'Failed to load posts');
} finally {
setLoading(false);
}
};
const createNewPost = async () => {
const newPost = {
title: 'New Post',
body: 'This is a new post created from the app',
userId: 1,
};
try {
const createdPost = await apiService.createPost(newPost);
setPosts(prev => [createdPost, ...prev]);
Alert.alert('Success', 'Post created successfully!');
} catch (err) {
Alert.alert('Error', 'Failed to create post');
}
};
const deletePost = async (id) => {
try {
await apiService.deletePost(id);
setPosts(prev => prev.filter(post => post.id !== id));
Alert.alert('Success', 'Post deleted successfully!');
} catch (err) {
Alert.alert('Error', 'Failed to delete post');
}
};
useEffect(() => {
loadPosts();
}, []);
const renderPost = ({ item }) => (
<View style={styles.postItem}>
<Text style={styles.postTitle}>{item.title}</Text>
<Text style={styles.postBody}>{item.body}</Text>
<View style={styles.postActions}>
<TouchableOpacity
style={styles.actionButton}
onPress={() => deletePost(item.id)}
>
<Text style={styles.actionButtonText}>Delete</Text>
</TouchableOpacity>
</View>
</View>
);
return (
<View style={styles.section}>
<Text style={styles.sectionTitle}>Posts (Axios)</Text>
<TouchableOpacity style={styles.createButton} onPress={createNewPost}>
<Text style={styles.createButtonText}>Create New Post</Text>
</TouchableOpacity>
{loading && <ActivityIndicator size="large" color="#2196F3" />}
{error && (
<View style={styles.errorContainer}>
<Text style={styles.errorText}>{error}</Text>
<TouchableOpacity style={styles.retryButton} onPress={loadPosts}>
<Text style={styles.retryButtonText}>Retry</Text>
</TouchableOpacity>
</View>
)}
<FlatList
data={posts}
keyExtractor={item => item.id.toString()}
renderItem={renderPost}
style={styles.list}
refreshing={loading}
onRefresh={loadPosts}
/>
</View>
);
};
// Main App
const App = () => {
return (
<View style={styles.container}>
<Text style={styles.title}>API Integration Example</Text>
<UserList />
<PostList />
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
backgroundColor: '#f5f5f5',
},
title: {
fontSize: 24,
fontWeight: 'bold',
textAlign: 'center',
marginBottom: 30,
color: '#333',
},
section: {
marginBottom: 30,
backgroundColor: 'white',
padding: 20,
borderRadius: 8,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 3,
},
sectionTitle: {
fontSize: 20,
fontWeight: 'bold',
marginBottom: 15,
color: '#333',
},
list: {
maxHeight: 200,
},
userItem: {
padding: 15,
borderBottomWidth: 1,
borderBottomColor: '#e0e0e0',
},
userName: {
fontSize: 16,
fontWeight: 'bold',
color: '#333',
marginBottom: 5,
},
userEmail: {
fontSize: 14,
color: '#666',
marginBottom: 2,
},
userWebsite: {
fontSize: 12,
color: '#999',
},
postItem: {
padding: 15,
borderBottomWidth: 1,
borderBottomColor: '#e0e0e0',
},
postTitle: {
fontSize: 16,
fontWeight: 'bold',
color: '#333',
marginBottom: 5,
},
postBody: {
fontSize: 14,
color: '#666',
marginBottom: 10,
},
postActions: {
flexDirection: 'row',
justifyContent: 'flex-end',
},
actionButton: {
backgroundColor: '#f44336',
padding: 8,
borderRadius: 5,
},
actionButtonText: {
color: 'white',
fontSize: 12,
fontWeight: 'bold',
},
createButton: {
backgroundColor: '#4CAF50',
padding: 15,
borderRadius: 8,
alignItems: 'center',
marginBottom: 15,
},
createButtonText: {
color: 'white',
fontSize: 16,
fontWeight: 'bold',
},
errorContainer: {
alignItems: 'center',
padding: 20,
},
errorText: {
color: '#f44336',
fontSize: 14,
textAlign: 'center',
marginBottom: 10,
},
retryButton: {
backgroundColor: '#2196F3',
padding: 10,
borderRadius: 5,
},
retryButtonText: {
color: 'white',
fontSize: 14,
fontWeight: 'bold',
},
});
export default App;