DEV Community

Abimanyu P
Abimanyu P

Posted on

Axios in React

What is Axios?

Axios is a JavaScript library used to make HTTP requests. In a React application, it is commonly used to communicate with APIs and backend servers. Through Axios, a React application can send requests to a server and receive data from it.

For example, a React application may need to get a list of movies from an API, send a new user to a backend, update existing data, or delete a record. Axios provides methods such as get(), post(), put(), patch(), and delete() for these operations.

The basic flow can be understood as:

React Application
       ↓
     Axios
       ↓
   HTTP Request
       ↓
      API
       ↓
   HTTP Response
       ↓
     Axios
       ↓
React Application
Enter fullscreen mode Exit fullscreen mode

Axios itself is not a database and does not permanently store the data. Its main responsibility is communication between the application and the server.

Installing Axios

Axios can be installed in a React project using:

npm install axios
Enter fullscreen mode Exit fullscreen mode

After installing it, import Axios into the component or JavaScript file where it is required:

import axios from "axios";
Enter fullscreen mode Exit fullscreen mode

Now Axios methods can be used to communicate with APIs.

Axios GET Request

The GET method is used when we want to retrieve data from a server.

const response = await axios.get("https://example.com/users");

console.log(response.data);
Enter fullscreen mode Exit fullscreen mode

Axios returns a response object that contains information such as the response data, status, and headers. The actual data returned by the server is normally accessed using response.data.

For example, if the API returns an array of users:

[
  {
    id: 1,
    name: "John"
  },
  {
    id: 2,
    name: "David"
  }
]
Enter fullscreen mode Exit fullscreen mode

then response.data contains this array.

Using GET in React

When data needs to be fetched when a component loads, Axios is commonly used inside useEffect().

import { useEffect, useState } from "react";
import axios from "axios";

function App() {

  const [users, setUsers] = useState([]);

  useEffect(() => {

    const getUsers = async () => {
      const response = await axios.get(
        "https://example.com/users"
      );

      setUsers(response.data);
    };

    getUsers();

  }, []);

  return (
    <div>
      {users.map((user) => (
        <div key={user.id}>
          <h2>{user.name}</h2>
        </div>
      ))}
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Initially, users is an empty array. The component renders, and then the effect runs. Axios sends the GET request. After the server responds, setUsers() updates the state. React then re-renders the component, and map() creates the UI for each user.

The flow is:

Component renders
       ↓
useEffect runs
       ↓
Axios sends GET request
       ↓
Server sends response
       ↓
response.data
       ↓
setUsers()
       ↓
React re-renders
       ↓
map() creates UI
Enter fullscreen mode Exit fullscreen mode

Mapping API Data in React

APIs frequently return an array of objects. React can use the JavaScript map() method to convert every object into JSX.

Suppose the API returns:

[
  {
    imdbID: "tt001",
    Title: "Avatar"
  },
  {
    imdbID: "tt002",
    Title: "Titanic"
  }
]
Enter fullscreen mode Exit fullscreen mode

It can be displayed like this:

<ul>
  {movie.map((x) => (
    <li key={x.imdbID}>
      <h1>{x.Title}</h1>
    </li>
  ))}
</ul>
Enter fullscreen mode Exit fullscreen mode

Here, map() goes through the array one object at a time. During each iteration, x represents the current movie object.

For the first object:

x = {
  imdbID: "tt001",
  Title: "Avatar"
}
Enter fullscreen mode Exit fullscreen mode

Therefore:

x.imdbID
Enter fullscreen mode Exit fullscreen mode

gives "tt001" and:

x.Title
Enter fullscreen mode Exit fullscreen mode

gives "Avatar".

The same process happens for every object in the array.

The key helps React identify each item in the list. A unique identifier from the API, such as imdbID, is generally preferable to using the array index.

Axios POST Request

The POST method is generally used to send data to a server, often to create a new resource.

The first argument is the URL, and the second argument is the data that should be sent to the server.

The basic structure is:

axios.post(url, data);
Enter fullscreen mode Exit fullscreen mode

For example, when a user submits a form in React, the form data can be sent using Axios:

const addUser = async () => {

  const user = {
    name: "John",
    age: 22
  };

  const response = await axios.post(
    "https://example.com/users",
    user
  );

  console.log(response.data);
};
Enter fullscreen mode Exit fullscreen mode

Dynamic GET Requests

The URL of a GET request can also be created based on user input.

For example:

const username = "john";

const response = await axios.get(
  `https://example.com/users/${username}`
);
Enter fullscreen mode Exit fullscreen mode

The resulting URL is:

https://example.com/users/john
Enter fullscreen mode Exit fullscreen mode

Template literals are useful for creating dynamic URLs.

Axios also supports query parameters through the params option:

const response = await axios.get(
  "https://example.com/movies",
  {
    params: {
      name: "Avatar"
    }
  }
);
Enter fullscreen mode Exit fullscreen mode

This produces a request containing a query parameter such as:

https://example.com/movies?name=Avatar
Enter fullscreen mode Exit fullscreen mode

Using params is often cleaner than manually constructing a long query string.

Other Axios Methods

Axios supports the common HTTP methods used for CRUD operations.

CREATE → POST
READ   → GET
UPDATE → PUT / PATCH
DELETE → DELETE
Enter fullscreen mode Exit fullscreen mode

For example:

axios.get("/users");
axios.post("/users", user);
axios.put("/users/10", user);
axios.patch("/users/10", { name: "David" });
axios.delete("/users/10");
Enter fullscreen mode Exit fullscreen mode

PUT is generally used to replace or update a resource, while PATCH is generally used for a partial update.

Error Handling

HTTP requests can fail for many reasons. The server may be unavailable, the URL may be incorrect, the user may not be authorized, or the network connection may fail.

Axios requests can be handled using try...catch:

try {

  const response = await axios.get(url);

  console.log(response.data);

} catch (error) {

  console.log(error);

}
Enter fullscreen mode Exit fullscreen mode

Headers

Some APIs require additional information in the request. This information can be sent using HTTP headers.

For example:

axios.get(url, {
  headers: {
    Authorization: `Bearer ${token}`
  }
});
Enter fullscreen mode Exit fullscreen mode

Headers are often used for authentication and other request metadata.

For a POST request, Axios can receive the request data and configuration separately:

axios.post(
  url,
  userData,
  {
    headers: {
      Authorization: `Bearer ${token}`
    }
  }
);
Enter fullscreen mode Exit fullscreen mode

The three arguments are:

URL
 ↓
Data
 ↓
Configuration
Enter fullscreen mode Exit fullscreen mode

Axios Instances

In larger applications, the same API base URL may be used repeatedly. Instead of writing the complete URL every time, an Axios instance can be created.

const api = axios.create({
  baseURL: "https://example.com/api"
});
Enter fullscreen mode Exit fullscreen mode

Now requests can be written as:

api.get("/users");
api.post("/users", user);
Enter fullscreen mode Exit fullscreen mode

This makes API-related code easier to organize and maintain.

Read more about axios

Top comments (0)