Вступление
Axios - это основанная на обещаниях библиотека JavaScript, которая
используется для отправки HTTP-запросов. Вы можете рассматривать его как
альтернативу встроенной функции
fetch()
В этом руководстве мы будем использовать такие функции, как Promises,
async/await
и другие современные шаблоны проектирования JavaScript.
Если вы хотите ускориться или освежить свою память, вам будет интересно
прочитать эти статьи, прежде чем продолжить:
- В этой статье для определения функций используются обозначения стрелок, представленные в ES2015. Вы можете прочитать об этом в статье « Стрелочные функции в JavaScript».
- Axios - это библиотека на основе обещаний. Если вам нужно узнать больше о обещаниях, вы можете прочитать наше руководство по обещаниям в Node.js.
- Чтобы улучшить наш опыт работы с обещаниями, мы будем использовать
синтаксис
async/await
Вы можете прочитать нашу статью Node.js Async Await в ES7, чтобы освоить эту функцию!
В этом руководстве мы будем выполнять GET
, POST
, PUT
и DELETE
к REST API с помощью Axios. Давайте узнаем немного больше об этой
библиотеке.
Что такое Axios?
Axios - это современная клиентская HTTP-библиотека на основе Promise. Это означает, что Axios используется для отправки HTTP-запроса и обработки их ответов с использованием обещаний JavaScript. Axios поддерживает в браузере как Node.js, так и JavaScript.
Axios также бесплатен и имеет открытый исходный код. Вы можете посетить его репозиторий GitHub, чтобы увидеть его код и документацию.
В него встроена некоторая веб-безопасность, защищающая пользователей от атак, таких как подделка межсайтовых запросов (CSRF) .
Благодаря своим функциям и простоте использования, он стал популярным выбором для разработчиков JavaScript при выполнении HTTP-вызовов. Начнем с настройки Axios.
Настройка Axios
Давайте сначала создадим новую папку и инициализируем NPM с настройками по умолчанию:
$ mkdir axios-tutorial
$ cd axios-tutorial
$ npm init -y
Затем мы можем использовать NPM для установки библиотеки:
$ npm i --save axios
Примечание . Если вы используете TypeScript в своем проекте (например, с приложением Angular), библиотека Axios поставляется вместе с определениями типов. Вам не нужно делать лишних шагов для установки типов!
Если вы находитесь в браузере, вы также можете использовать CDN для импорта скрипта.
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
В этом руководстве для загрузки наших библиотек используется Node.js с
CommonJS. CommonJS - это стандарт для загрузки модулей, в частности, для
этого он определяет ключевое слово require()
Примеры должны работать
независимо от платформы без каких-либо изменений.
Теперь, когда мы настроили Axios в нашей среде разработки, давайте сразу приступим к выполнению HTTP-запросов.
Написание асинхронных запросов с помощью Axios
В Node.js операции ввода и вывода, такие как сетевые запросы,
выполняются асинхронно. Поскольку Axios использует обещания для
выполнения сетевых запросов, обратные вызовы не подходят при
использовании этой библиотеки. Мы взаимодействуем с Axios с помощью
обещаний или async/await
которые являются альтернативным синтаксисом
для использования обещаний.
Импорт Axios
Если вы используете CommonJS, в Node.js есть два метода импорта библиотеки.
Вы можете импортировать модуль в свой код следующим образом:
const axios = require('axios')
Однако многие редакторы IDE и кода могут предложить лучшее автозаполнение при импорте следующим образом:
const axios = require('axios').default;
Это работает при использовании CommonJS для импорта модулей. Мы рекомендуем вам использовать второй метод в качестве автозаполнения, и просмотр документации по коду в вашей среде IDE может упростить процесс разработки.
С импортированной библиотекой мы можем начать делать HTTP-запросы.
Отправка запросов GET
Отправим наш первый запрос через Axios! Это будет GET
, обычно
используемый для получения данных.
Мы сделаем HTTP-запрос к внешнему API, который отправит нам список сообщений в блоге. Получив данные, мы запишем их содержимое в консоль. Если мы обнаружим ошибку, мы ее тоже зарегистрируем.
Давайте посмотрим, как сделать его, используя синтаксис Promise по
умолчанию. В новый файл с именем getRequestPromise.js
добавьте
следующий код:
const axios = require('axios').default;
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(resp => {
console.log(resp.data);
})
.catch(err => {
// Handle Error Here
console.error(err);
});
Чтобы сделать GET
, мы передаем URL-адрес ресурса в качестве аргумента
в axios.get()
.
Если вы запустите этот код с node getRequestPromise.js
, вы увидите
следующий результат:
[ { userId: 1,
id: 1,
title:
'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
body:
'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum
est autem sunt rem eveniet architecto' },
{ userId: 1,
id: 2,
title: 'qui est esse',
body:
'est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro ve
l nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla' },
...
Теперь давайте посмотрим, как мы можем переписать тот же код, используя
ключевые слова async/await
В новый файл getRequestAsyncAwait.js
добавьте следующий код:
const axios = require('axios');
const sendGetRequest = async () => {
try {
const resp = await axios.get('https://jsonplaceholder.typicode.com/posts');
console.log(resp.data);
} catch (err) {
// Handle Error Here
console.error(err);
}
};
sendGetRequest();
Чтобы использовать async/await
, нам нужно обернуть вызов функции
axios.get()
async
функции. Мы заключаем вызов метода в блок
try...catch
чтобы мы могли фиксировать любые ошибки, аналогично
catch()
который мы использовали в версии Promise. Переменная,
получившая данные HTTP, должна была использовать await
чтобы
гарантировать получение асинхронных данных, прежде чем продолжить. С
этого момента в наших примерах мы будем использовать только
async/await
Запуск этого кода выведет на консоль тот же вывод, что и исходный пример Promise.
Ответ Axios на HTTP-запрос ( resp
в примере) будет содержать следующую
информацию об ответе HTTP:
data
- тело ответа, предоставленное сервером. Если ответ сервера является JSON, Axios автоматически анализирует данные в объект JavaScript.status
- код состояния HTTP из ответа, например200
,400
,404
.statusText
- сообщение о статусе HTTP из ответа сервера, напримерOK
,Bad Request
,Not Found
.headers
- заголовки HTTP, сопровождающие ответ.config
- конфигурация, предоставленная API Axios для запроса.request
- Собственный запрос, который сгенерировал ответ. В Node.js это будет объектClientRequest
В браузере это будет объектXMLHTTPRequest
Теперь, когда мы увидели, как сделать GET
запрос с помощью Axios,
давайте посмотрим, как сделать POST
запрос.
Отправка запросов POST
Мы отправляем POST
для создания нового ресурса в REST API. В этом
случае мы сделаем POST
запрос с Axios, чтобы создать новую запись в
блоге для пользователя.
Создайте новый файл с именем postRequest.js
и введите следующий код:
const axios = require('axios').default;
const newPost = {
userId: 1,
title: 'A new post',
body: 'This is the body of the new post'
};
const sendPostRequest = async () => {
try {
const resp = await axios.post('https://jsonplaceholder.typicode.com/posts', newPost);
console.log(resp.data);
} catch (err) {
// Handle Error Here
console.error(err);
}
};
sendPostRequest();
Чтобы отправить POST
с помощью axios.post()
вы должны сначала
указать URL-адрес, а затем предоставить данные запроса во втором
аргументе. В этом случае мы отправляем данные в newPost
, которые
будут отправлены в наш API как JSON.
Выполнение этого с помощью node postRequest.js
дает следующий успешный
результат:
{ userId: 1,
title: 'A new post',
body: 'This is the body of the new post',
id: 101 }
Давайте посмотрим, как мы можем отправлять запросы PUT
Отправка запросов PUT
PUT
используются для замены данных в конечной точке. Вы можете
использовать метод axios.put()
для отправки PUT
аналогично тому, как
мы отправляем запросы POST
Чтобы увидеть это в действии, давайте создадим PUT
который обновляет
свойства первого сообщения в блоге. Создайте новый файл с именем
putRequest.js
с приведенным ниже кодом:
const axios = require('axios').default;
const updatedPost = {
id: 1,
userId: 1,
title: 'A new title',
body: 'Update this post'
};
const sendPutRequest = async () => {
try {
const resp = await axios.put('https://jsonplaceholder.typicode.com/posts/1', updatedPost);
console.log(resp.data);
} catch (err) {
// Handle Error Here
console.error(err);
}
};
sendPutRequest();
Как и в случае с POST
, мы предоставляем URL-адрес и данные, которые
хотим загрузить. Выполнение этого с помощью node putRequest.js
дает
нам:
{ id: 1, userId: 1, title: 'A new title', body: 'Update this post' }
Теперь, когда мы рассмотрели два способа загрузки данных, давайте посмотрим, как мы можем удалить данные.
Отправка запросов DELETE
Вы можете отправить HTTP- DELETE
с помощью axios.delete()
для
удаления данных из RESTful API.
Давайте удалим сообщение в блоге, отправив DELETE
с помощью Axios. В
новом файле с именем deleteRequest.js
введите следующее:
const axios = require('axios').default;
const sendDeleteRequest = async () => {
try {
const resp = await axios.delete('https://jsonplaceholder.typicode.com/posts/1')
console.log(resp.data);
} catch (err) {
// Handle Error Here
console.error(err);
}
};
sendDeleteRequest();
Для функции axios.delete()
нужен только URL-адрес ресурса, который мы
хотим удалить. Выполнение этой программы с помощью node putRequest.js
отображает это в терминале:
{}
Это означает, что данные не были возвращены, что нормально при удалении ресурса. Однако, поскольку Axios не генерировал никаких ошибок, мы уверены, что они были обработаны правильно.
Давайте посмотрим на альтернативный способ отправки запросов Axios с использованием конфигураций,
Настройка запросов
В качестве альтернативы указанию функции для выполнения запроса мы можем
предоставить объект JavaScript, который настраивает, как Axios
отправляет запрос. Например, если я хотел отправить PUT
без
использования axios.put()
, мы можем настроить Axios следующим
образом:
const axios = require('axios').default;
const sendRequest = async () => {
try {
const resp = await axios({
method: 'PUT',
url: 'https://jsonplaceholder.typicode.com/posts/1',
data: {
id: 1,
userId: 1,
title: 'A new title',
body: 'Update this post'
}
});
console.log(resp.data);
} catch (err) {
// Handle Error Here
console.error(err);
}
}
sendRequest();
В этом случае мы используем axios
напрямую как функцию. Мы передаем
ему функцию JavaScript, которая содержит метод HTTP, используемый в
method
, конечную точку API в url
и любые данные в запросе в
свойстве data
Конечный результат тот же, поэтому вы можете использовать этот способ отправки запросов, если он вам больше нравится.
Теперь, когда у нас есть обработчик отправки запросов, давайте изменим их, установив собственные заголовки.
Установить собственные заголовки
Для некоторых API необработанный запрос должен содержать дополнительные данные в заголовках для обработки. Типичным примером может быть установка заголовков, которые аутентифицируют HTTP-запрос.
Если бы мы использовали JWT для аутентификации и авторизации , нам пришлось бы добавить его в наши запросы, чтобы он не был отклонен сервером API.
Давайте посмотрим, как мы можем добавить пользовательские заголовки к
вызову метода axios.get()
const axios = require('axios').default;
const sendGetRequest = async () => {
try {
const resp = await axios.get('https://jsonplaceholder.typicode.com/posts', {
headers: {
'authorization': 'Bearer YOUR_JWT_TOKEN_HERE'
}
});
console.log(resp.data);
} catch (err) {
// Handle Error Here
console.error(err);
}
};
sendGetRequest();
Как вы можете видеть в этом примере кода, мы можем передать конфигурацию
со headers
чтобы установить пользовательские заголовки для запроса.
Свойство headers
- это объект JavaScript со строковыми ключами и
значениями.
Вы можете добавить это свойство к другим методам axios.post()
,
axios.put()
, axios.delete()
. Свойство headers
следует вводить
после объекта data
axios.post()
и axios.put()
.
Затем давайте посмотрим, как мы можем установить собственный заголовок с помощью конфигурации API Axios:
const axios = require('axios').default;
axios({
method: 'GET',
url: 'https://jsonplaceholder.typicode.com/posts',
headers: {
'authorization': 'Bearer YOUR_JWT_TOKEN_HERE'
}
}).then(resp => {
console.log(resp.data);
}).catch(err => {
// Handle Error Here
console.error(err);
});
В этом случае заголовки - это просто еще одно свойство объекта JavaScript!
Заключение
В этой статье вы узнали, как создавать асинхронные HTTP-запросы с
помощью Axios в Node.js и JavaScript в браузере. Вы делали запросы с
помощью методов axios.get()
, axios.post()
, axios.put()
и
axios.delete()
. Вы также использовали Axios API для отправки
HTTP-запросов, настроив объект JavaScript с деталями запроса. Наконец,
вы добавили собственные заголовки в свои запросы.
Мы надеемся, что теперь вы хорошо понимаете, как использовать Axios для своего следующего приложения! Что вы собираетесь построить дальше?
Исходный код этой статьи доступен на GitHub .