How to Integrate RESTful APIs in ReactJS Applications

Introduction

ReactJS is a popular JavaScript library for building dynamic and interactive user interfaces. In real-world applications, it’s often necessary to fetch and manipulate data from external sources—this is where RESTful APIs come into play.

In this article, we’ll walk through how to integrate RESTful APIs in ReactJS applications, covering best practices, popular tools, and a hands-on example to help you connect your front-end with back-end services effectively.


What is a RESTful API?

A RESTful API (Representational State Transfer) is a standard architecture for designing networked applications. It allows front-end applications like those built with ReactJS to:

  • Retrieve data (GET)

  • Create new data (POST)

  • Update data (PUT/PATCH)

  • Delete data (DELETE)

REST APIs typically return data in JSON format, which is easy to work with in JavaScript.


Step-by-Step Guide to Integrating REST APIs in React

🔹 1. Set Up a React App

Use Create React App to quickly set up your project.

npx create-react-app api-integration-demo
cd api-integration-demo
npm start


🔹 2. Use fetch or axios for API Requests

React doesn’t have built-in API integration support, so you can use:

  • fetch (native JavaScript)

  • axios (a popular promise-based HTTP client)

✅ Example with fetch:

useEffect(() => {
  fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.json())
    .then((data) => setUsers(data))
    .catch((error) => console.error('Error:', error));
}, []);

✅ Example with axios:

npm install axios

import axios from 'axios';

useEffect(() => {
  axios.get('https://jsonplaceholder.typicode.com/users')
    .then((response) => setUsers(response.data))
    .catch((error) => console.error('Error:', error));
}, []);

🔹 3. Store Data in State

Use React’s useState and useEffect hooks to manage data and side effects.

import React, { useState, useEffect } from 'react';

function UserList() {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/users')
      .then((res) => res.json())
      .then((data) => setUsers(data));
  }, []);

  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

🔹 4. Handle Loading and Error States

Always handle loading and error states to improve user experience.

const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);

useEffect(() => {
  fetch('https://api.example.com/data')
    .then((res) => res.json())
    .then((data) => {
      setData(data);
      setLoading(false);
    })
    .catch((err) => {
      setError(err);
      setLoading(false);
    });
}, []);

🔹 5. Create a Reusable API Service Layer

Avoid duplicating API logic by abstracting it into a separate module.

// services/api.js
import axios from 'axios';

const API_BASE_URL = 'https://api.example.com';

export const getUsers = () => axios.get(`${API_BASE_URL}/users`);
export const getUser = (id) => axios.get(`${API_BASE_URL}/users/${id}`);
export const createUser = (data) => axios.post(`${API_BASE_URL}/users`, data);
// In your component
import { getUsers } from './services/api';

useEffect(() => {
  getUsers()
    .then((res) => setUsers(res.data))
    .catch(console.error);
}, []);

Best Practices

Use async/await for cleaner and more readable asynchronous code
Separate concerns: Keep API calls outside of components
Use environment variables for storing API URLs and keys
Handle edge cases: API downtime, 404s, network errors
Paginate large data to reduce load on the client
Secure APIs with tokens or authentication headers if required


Bonus: Using React Query or SWR for Advanced Fetching

For more complex applications, consider using libraries like:

  • React Query – Caching, background updates, query invalidation

  • SWR – Stale-while-revalidate strategy, caching, and re-fetching

React Query Example:

npm install @tanstack/react-query
import { useQuery } from '@tanstack/react-query';

function Users() {
  const { data, isLoading, error } = useQuery(['users'], () =>
    fetch('https://jsonplaceholder.typicode.com/users').then((res) => res.json())
  );

  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>Error occurred</p>;

  return (
    <ul>
      {data.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

Conclusion

Integrating RESTful APIs in React is an essential skill for any front-end developer. By using tools like fetch, axios, or advanced libraries like React Query, you can create dynamic, data-driven applications with ease.

🔑 Key Takeaways:

  • Use useEffect for side effects like API calls

  • Manage state with useState

  • Handle loading and error states

  • Separate API logic from UI components

  • Optimize with libraries when scaling

With the right structure and practices, your React app can efficiently communicate with APIs and deliver a smooth user experience. 🚀

Rakshit Patel

Author Image I am the Founder of Crest Infotech With over 18 years’ experience in web design, web development, mobile apps development and content marketing. I ensure that we deliver quality website to you which is optimized to improve your business, sales and profits. We create websites that rank at the top of Google and can be easily updated by you.

Related Blogs