Как использовать Axios в React

На том или ином этапе разработки многим веб-проектам необходимо взаимодействовать с REST API. Axios — это облегченный HTTP-клиент, основанный на сервисе $http внутри Angular.js v1.x и подобный встроенному в JavaScript Fetch API.

Читайте также: Основы Fetch API в JavaScript

Axios основан на промисах, что позволяет пользоваться преимуществами async и await для создания более читаемого асинхронного кода.

Вы также можете перехватывать и отменять запросы. Кроме того, в Axios на стороне клиента имеется встроенная защита от подделки межсайтовых запросов.

В этой статье вы найдете примеры того, как использовать Axios для доступа к популярному JSON Placeholder API в приложении React.

Требования

  • Локальная установка Node.js, которую можно получить, следуя инструкциям для вашего дистрибутива: Mac OSUbuntuCentOSDebian.
  • Свежий проект React с поддержкой Create React App.
  • Базовые навыки работы с JavaScript, HTML и CSS.

Это руководство было протестировано на версиях Node.js v16.13.1, npm v8.1.4, react v17.0.2 и axios v0.24.0.

1: Добавление Axios в проект

Для начала поговорим о том, как добавить Axios в проект React.

npx create-react-app react-axios-example

Чтобы добавить Axios в проект, откройте терминал и перейдите в каталог проекта:

cd react-axios-example

Затем выполните эту команду, чтобы установить Axios:

npm install axios@0.24.0

Затем нужно импортировать Axios в файл, в котором вы хотите его использовать.

2: Создание запроса GET

Давайте создадим новый компонент и импортируем в него Axios для отправки запроса GET.

Внутри проекта React вам нужно будет создать новый компонент по имени PersonList.

Сначала создайте новый подкаталог components в каталоге src:

mkdir src/components

В этом каталоге создайте PersonList.js и добавьте в компонент следующий код:

import React from 'react';
import axios from 'axios';

export default class PersonList extends React.Component {
  state = {
    persons: []
  }

  componentDidMount() {
    axios.get(`https://jsonplaceholder.typicode.com/users`)
      .then(res => {
        const persons = res.data;
        this.setState({ persons });
      })
  }

  render() {
    return (
      <ul>
        {
          this.state.persons
            .map(person =>
              <li key={person.id}>{person.name}</li>
            )
        }
      </ul>
    )
  }
}

Во-первых, здесь мы импортируем React и Axios, чтобы их можно было использовать в компоненте. Во-вторых, мы подключаемся к хуку жизненного цикла componentDidMount и выполняем запрос GET.

axios.get(url) с URL-адресом из конечной точки API позволяет получить промис, который возвращает объект ответа. Внутри объекта ответа есть данные, которым затем присваивается значение person.

Вы также можете получить другую информацию о запросе, например, код состояния в res.status или дополнительную информацию внутри res.request.

Добавьте этот компонент в app.js:

import PersonList from './components/PersonList.js';

function App() {
  return (
    <div ClassName="App">
      <PersonList/>
    </div>
  )
}

Затем запустите ваше приложение:

npm start

Просмотр приложения в браузере. На странице будет представлен список из 10 имен.

3: Создание POST-запроса

На этом этапе мы попробуем использовать Axios с другим методом HTTP-запроса, который называется POST.

Внутри проекта React нужно создать новый компонент по имени PersonAdd.

Создайте файл PersonAdd.js и добавьте следующий код, чтобы создать форму, которая позволяет пользователю вводить данные и затем отправляет содержимое в API:

import React from 'react';
import axios from 'axios';

export default class PersonAdd extends React.Component {
  state = {
    name: ''
  }

  handleChange = event => {
    this.setState({ name: event.target.value });
  }

  handleSubmit = event => {
    event.preventDefault();

    const user = {
      name: this.state.name
    };

    axios.post(`https://jsonplaceholder.typicode.com/users`, { user })
      .then(res => {
        console.log(res);
        console.log(res.data);
      })
  }

  render() {
    return (
      <div>
        <form onSubmit={this.handleSubmit}>
          <label>
            Person Name:
            <input type="text" name="name" onChange={this.handleChange} />
          </label>
          <button type="submit">Add</button>
        </form>
      </div>
    )
  }
}

Внутри функции handleSubmit предотвращается стандартное действие формы. Затем мы обновляем state до ввода user.

Использование POST дает вам тот же объект ответа с информацией, которую вы можете использовать внутри вызова then.

Чтобы выполнить POST запрос, сначала нужно зафиксировать пользовательский ввод. Затем следует добавить ввод вместе с POST запросом, который выдаст вам ответ. После этого можно применить к ответу console.log, который должен отображать пользовательский ввод в форме.

Добавьте этот компонент в app.js:

import PersonList from './components/PersonList';
import PersonAdd from './components/PersonAdd';

function App() {
  return (
    <div ClassName="App">
      <PersonAdd/>
      <PersonList/>
    </div>
  )
}

Затем запустите приложение:

npm start

Просмотрите приложение в браузере. На экране появится форма для добавления новых пользователей. После отправки нового пользователя проверьте консоль.

4: Создание DELETE запроса

В этом примере вы увидите, как удалять элементы из API с помощью axios.delete, передавая URL-адрес в качестве параметра.

Внутри проекта React нужно создать новый компонент по имени PersonRemove.

Создайте PersonRemove.js и добавьте в него следующий код для удаления пользователя:

import React from 'react';
import axios from 'axios';

export default class PersonRemove extends React.Component {
  state = {
    id: ''
  }

  handleChange = event => {
    this.setState({ id: event.target.value });
  }

  handleSubmit = event => {
    event.preventDefault();

    axios.delete(`https://jsonplaceholder.typicode.com/users/${this.state.id}`)
      .then(res => {
        console.log(res);
        console.log(res.data);
      })
  }

  render() {
    return (
      <div>
        <form onSubmit={this.handleSubmit}>
          <label>
            Person ID:
            <input type="number" name="id" onChange={this.handleChange} />
          </label>
          <button type="submit">Delete</button>
        </form>
      </div>
    )
  }
}

Опять же, объект res предоставляет данные о запросе. При помощи console.log мы собираем эту информацию после отправки формы.

Добавьте в app.js следующие строки:

import PersonList from './components/PersonList';
import PersonAdd from './components/PersonAdd';
import PersonRemove from './components/PersonRemove';

function App() {
  return (
    <div ClassName="App">
      <PersonAdd/>
      <PersonList/>
      <PersonRemove/>
    </div>
  )
}

Запустите приложение:

npm start

Просмотрите приложение в браузере. На экране вы увидите форму для удаления пользователей.

5: Базовый экземпляр в Axios

В этом примере вы увидите, как настроить базовый экземпляр, в котором можно определить URL-адрес и любые другие элементы конфигурации.

Создайте отдельный файл по имени api.js:

nano src/api.js

Экспортируйте новый экземпляр axios со следующими стандартными значениями:

import axios from 'axios';

export default axios.create({
  baseURL: `http://jsonplaceholder.typicode.com/`
});

После настройки базового экземпляра его можно использовать внутри компонента PersonRemove. Импортировать его можно следующим образом:

import React from 'react';

import API from '../api';

export default class PersonRemove extends React.Component {
  // ...

  handleSubmit = event => {
    event.preventDefault();

    API.delete(`users/${this.state.id}`)
      .then(res => {
        console.log(res);
        console.log(res.data);
      })
  }

  // ...
}

Поскольку http://jsonplaceholder.typicode.com/ теперь является базовым URL-адресом, вам больше не нужно вводить весь URL-адрес каждый раз, когда вы хотите перейти к другой конечной точке в API.

6: Использование async и await

В этом примере вы увидите, как использовать async и await для работы с промисами.

Ключевое слово await разрешает промис и возвращает значение, которое затем может быть присвоено переменной. Давайте вернемся к файлу PersonRemove.js.

import React from 'react';

import API from '../api';

export default class PersonRemove extends React.Component {
  // ...

  handleSubmit = event => {
    event.preventDefault();

    const response = await API.delete(`users/${this.state.id}`);

    console.log(response);
    console.log(response.data);
  }

  // ...
}

В этом примере кода мы заменили .then(). Промис разрешается, а его значение сохраняется внутри переменной response.

Итоги

В этом руководстве мы рассмотрели несколько примеров использования Axios в приложении React – мы создали несколько HTTP-запросов и обработали ряд ответов.

Tags: , ,

Добавить комментарий