Відповіді:
Fetch і Axios дуже схожі за функціональністю, але для більшої зворотної сумісності Axios, здається, працює краще (наприклад, не працює в IE 11, перевірте цей пост )
Крім того, якщо ви працюєте з запитами JSON, наступні деякі відмінності, з якими я натрапив.
Отримати запит на публікацію JSON
let url = 'https://someurl.com';
let options = {
method: 'POST',
mode: 'cors',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
body: JSON.stringify({
property_one: value_one,
property_two: value_two
})
};
let response = await fetch(url, options);
let responseOK = response && response.ok;
if (responseOK) {
let data = await response.json();
// do something with data
}
Axios JSON поштовий запит
let url = 'https://someurl.com';
let options = {
method: 'POST',
url: url,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: {
property_one: value_one,
property_two: value_two
}
};
let response = await axios(options);
let responseOK = response && response.status === 200 && response.statusText === 'OK';
if (responseOK) {
let data = await response.data;
// do something with data
}
Так:
Сподіваюся, це допомагає.
Axios request is ok when status is 200 and statusText is 'OK'
Що з іншими httpStatus в діапазоні 2xx, як 201 або 204?
Вони є бібліотеками запитів HTTP ...
Я закінчуюсь тим же сумнівом, але таблиця в цій публікації змушує мене піти isomorphic-fetch
. Що є, fetch
але працює з NodeJS.
http://andrewhfarmer.com/ajax-libraries/
Посилання вище мертве. Та сама таблиця тут: https://www.javascriptstuff.com/ajax-libraries/
fetch
як Native ( значить , що ви не можете просто використовувати його - не потрібно включати бібліотеку , в відповідно до джерела таблиці), в той час як на самому ділі fetch
це не реалізоване в деяких платформах ( в Зокрема , у всіх версіях IE), для якого необхідно надати зовнішній поліфіл все одно.
timeout
(що дуже дивно), ми повинні використовувати окремий модуль для реалізації цієї основної функціональності.
За інформацією mzabriskie на GitHub :
В цілому вони дуже схожі. Деякі переваги axios:
Трансформатори: дозволяють виконувати перетворення даних перед тим, як буде зроблено запит або після отримання відповіді
Перехоплювачі: дозволяють повністю змінити запит або відповідь (також заголовки). також виконайте операції асинхронізації до того, як буде зроблено запит або до того, як Promise влаштується
Вбудований захист XSRF
перевірте Axios для підтримки браузера
Я думаю, вам слід використовувати аксіоси.
Ще одна основна відмінність між API API і axios API
Axios - це окремий сторонній пакет, який легко встановити в проект React за допомогою NPM.
Інший варіант, який ви згадали, - це функція отримання. На відміну від Axios, fetch()
він вбудований у більшість сучасних браузерів. За допомогою програми вам не потрібно встановлювати сторонній пакет.
Тож залежати від вас, ви можете піти з цим fetch()
і, можливо, зіпсуватись, якщо не знаєте, що ви робите, АБО просто скористайтеся Axios, що на мою думку є більш простим.
Окрім цього ... я грав у різних тестах на своєму тесті і помічав їхнє поводження із запитами 4xx. У цьому випадку мій тест повертає об’єкт json з відповіддю 400. Ось як реагують 3 популярні губи:
// request-promise-native
const body = request({ url: url, json: true })
const res = await t.throws(body);
console.log(res.error)
// node-fetch
const body = await fetch(url)
console.log(await body.json())
// Axios
const body = axios.get(url)
const res = await t.throws(body);
console.log(res.response.data)
Цікаво, що це request-promise-native
і axios
кинути на 4xx відповідь, поки node-fetch
не. Також fetch
використовує обіцянку для розбору json.
.throws
метод перевірки викинутих помилок. У цьому випадку я тестував відхилення від al 3 libs і помітив різницю в даних, які були повернуті.
Переваги аксіосу: