Чим відрізняється Axios від Fetch?


182

Я закликаю веб-сервіс за допомогою вибору, але те саме, що я можу зробити за допомогою axios. Тож тепер я розгублений. Чи варто їхати або по аксіосам, або за добу?


4
Я думаю, що це було обговорено дуже докладно над github.com/mzabriskie/axios/isissue/314
Jaydeep Solanki

Відповіді:


164

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 ' дані
  • Тіло Fetch повинно бути впорядковано , дані Axios містять об'єкт
  • У "Вилучення " немає URL-адреси в об'єкті запиту, Axios має URL-адресу в об'єкті запиту
  • Функція отримання запиту включає URL як параметр , функція запиту Axios не включає URL як параметр .
  • Запит на отримання нормально, коли об'єкт відповіді містить властивість ok , запит Axios - це нормально, коли стан 200, а statusText - "ОК"
  • Щоб отримати відповідь об'єкта json: у виклику для виклику функції json () на об'єкт відповіді, в Axios отримують властивість даних об'єкта відповіді.

Сподіваюся, це допомагає.


Тут ще питання. Після того, як responseOk відповідає дійсності, чи потрібно нам перевіряти стан у response.data, чи він надав статус? дякую
Ян Ван

1
Axios request is ok when status is 200 and statusText is 'OK' Що з іншими httpStatus в діапазоні 2xx, як 201 або 204?
leonbloy

46

Вони є бібліотеками запитів HTTP ...

Я закінчуюсь тим же сумнівом, але таблиця в цій публікації змушує мене піти isomorphic-fetch. Що є, fetchале працює з NodeJS.

http://andrewhfarmer.com/ajax-libraries/


Посилання вище мертве. Та сама таблиця тут: https://www.javascriptstuff.com/ajax-libraries/

Або тут: введіть тут опис зображення


6
І все-таки я не в змозі знайти користь від осінь. Ви можете мати якусь ідею, навіщо мені їхати з аксіосами?
Горах Нат

4
Я думаю, що "fetch" є стандартним див. Fetch.spec.whatwg.org ... axios може мати більше можливостей, тому що це не випливає .... Я думаю, врешті-решт, вони виконують основи (ajax http запит), але це залежить про те, що вам потрібно ... Мені не потрібен трансформатор ... тому отримання стандартної лінзи - це профі ...
Лукас Катаяма

4
Майте на увазі, що ця таблиця вводить в оману. Він визначає , fetchяк Native ( значить , що ви не можете просто використовувати його - не потрібно включати бібліотеку , в відповідно до джерела таблиці), в той час як на самому ділі fetchце не реалізоване в деяких платформах ( в Зокрема , у всіх версіях IE), для якого необхідно надати зовнішній поліфіл все одно.
Лука Фагіолі

3
Додаючи різницю, яку згадує @ jack123 fetch, також не передбачено базової функціональності ajax на зразок timeout(що дуже дивно), ми повинні використовувати окремий модуль для реалізації цієї основної функціональності.
Апурва джейн

2
@LucasKatayama Посилання порушено
vancy-pants

30

За інформацією mzabriskie на GitHub :

В цілому вони дуже схожі. Деякі переваги axios:

  • Трансформатори: дозволяють виконувати перетворення даних перед тим, як буде зроблено запит або після отримання відповіді

  • Перехоплювачі: дозволяють повністю змінити запит або відповідь (також заголовки). також виконайте операції асинхронізації до того, як буде зроблено запит або до того, як Promise влаштується

  • Вбудований захист XSRF

перевірте Axios для підтримки браузера

введіть тут опис зображення

Я думаю, вам слід використовувати аксіоси.


4
Домовились. Аксіос також є невеликим імпортним імпортом, так що роздуття не викликає особливих проблем - на відміну від чогось на кшталт експресу чи мангуста, де, якщо хтось трохи божевільний щодо розміру пакету, вони можуть бути занепокоєні. :)
CodeFinity

1
Будь ласка, не повертайте законні зміни та не копіюйте вміст без атрибуції.
jonrsharpe

9

Ще одна основна відмінність між API API і axios API

  • Під час використання сервісного працівника ви повинні використовувати API отримання лише у випадку, якщо ви хочете перехопити HTTP-запит
  • Вих. Під час виконання кешування в PWA за допомогою сервісного працівника ви не зможете кешувати, якщо ви використовуєте API axios (він працює лише з API отримання)

6
Чи може хтось переконатися, що це дійсно так? Це 1 особа, але 9 подій, схоже, згодні, але було б непогано побачити коментарі до цього (я використовую аксіоси з сервісним працівником pwa в автономному режимі, тому я прошу.
Том

Звичайно, у нас може бути ще кілька коментарів до цього, але я стикався з проблемами кешування під час використання axios, і коли я замінив API axios на API (API) fetch (), він вирішився
Vaibhav Bacchav

1
Це здається правильним, але може бути виправлено найближчим часом: github.com/axios/axios/pull/2891
arkhz

7

Axios - це окремий сторонній пакет, який легко встановити в проект React за допомогою NPM.

Інший варіант, який ви згадали, - це функція отримання. На відміну від Axios, fetch()він вбудований у більшість сучасних браузерів. За допомогою програми вам не потрібно встановлювати сторонній пакет.

Тож залежати від вас, ви можете піти з цим fetch()і, можливо, зіпсуватись, якщо не знаєте, що ви робите, АБО просто скористайтеся Axios, що на мою думку є більш простим.


1
З програмою все гаразд, але Аксіос, як ви сказали, - простіший. Те, що вбудовано в сучасні браузери (витяг), не дуже підходить для випусків функцій. - тому я віддаю перевагу Аксіос
Том

5

Окрім цього ... я грав у різних тестах на своєму тесті і помічав їхнє поводження із запитами 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.


1
@baitun - це ті, хто працює з тестами, які (я думаю, я використовував Mocha) часто мають .throwsметод перевірки викинутих помилок. У цьому випадку я тестував відхилення від al 3 libs і помітив різницю в даних, які були повернуті.
cyberwombat

3

Переваги аксіосу:

  • Трансформатори: дозволяють виконувати перетворення даних перед тим, як буде зроблено запит або після отримання відповіді
  • Перехоплювачі: дозволяють повністю змінити запит або відповідь (також заголовки). також виконувати операції асинхронізації до того, як буде зроблено запит або до того, як Promise влаштується
  • Вбудований захист XSRF

Переваги axiosпонадfetch

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.