Axios และ Fetch แตกต่างกันอย่างไร


182

ฉันกำลังเรียกใช้บริการเว็บโดยใช้การดึงข้อมูล แต่ฉันสามารถทำได้ด้วยความช่วยเหลือของ axios ดังนั้นตอนนี้ฉันสับสน ฉันควรจะไปหา axios หรือ fetch ไหม?


4
ฉันคิดว่าสิ่งนี้ได้รับการพูดคุยในรายละเอียดที่ดีกว่าgithub.com/mzabriskie/axios/issues/314
Jaydeep Solanki

คำตอบ:


164

การดึงข้อมูลและ 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
}

ดังนั้น:

  • Fetch's body = ข้อมูล Axios
  • การดึงข้อมูลของร่างกายจะต้องมีการstringifiedข้อมูล Axios' มีวัตถุ
  • การดึงข้อมูลไม่มี URLในวัตถุคำขอ Axios มี URLในวัตถุคำขอ
  • ฟังก์ชั่นการดึงข้อมูลคำขอจะประกอบด้วยURL เป็นพารามิเตอร์ฟังก์ชั่นการร้องขอ Axios ไม่รวมถึง URL เป็นพารามิเตอร์
  • คำขอดึงข้อมูลเป็นokเมื่อวัตถุการตอบสนองที่มีคุณสมบัติ okขอ Axios เป็นokเมื่อสถานะคือ 200และ statusText เป็น 'ตกลง'
  • ในการรับการตอบสนองวัตถุ json: ในการเรียกใช้ฟังก์ชัน json ()บนวัตถุตอบกลับใน Axios จะได้รับคุณสมบัติข้อมูลของวัตถุตอบกลับ

หวังว่านี่จะช่วยได้


นี่คือคำถามเพิ่มเติม เมื่อ responseOk เป็นจริงเราจำเป็นต้องตรวจสอบสถานะใน response.data หรือไม่หากมีสถานะที่ระบุไว้ ขอบคุณ
Yang Wang

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-l ไลบรารี/

หรือที่นี่: ป้อนคำอธิบายรูปภาพที่นี่


6
ถึงกระนั้นฉันก็ยังไม่สามารถหาประโยชน์ของการดึงเอา axios ได้ คุณมีความคิดไหมว่าทำไมฉันถึงไปกับ axios?
Gorakh Nath

4
ฉันคิดว่าการดึงข้อมูลเป็นมาตรฐานดูfetch.spec.whatwg.org ... axios อาจมีคุณสมบัติมากกว่านี้เพราะมันไม่ได้เป็นไปตามนั้น ... ฉันคิดว่าในท้ายที่สุดแล้วพวกเขาก็ทำพื้นฐาน (คำขอ ajax http) แต่ขึ้นอยู่กับ ในสิ่งที่คุณต้องการ ... ฉันไม่ต้องการหม้อแปลง ... ดังนั้นการได้รับมาตรฐาน lib เป็นมืออาชีพ ...
Lucas Katayama

4
ระวังว่าตารางนั้นทำให้เข้าใจผิด มันกำหนดfetchเป็นพื้นเมือง ( ความหมายคุณก็สามารถใช้งานได้ - ไม่จำเป็นต้อง ได้แก่ ห้องสมุด , ตามแหล่งที่มาของตาราง) ขณะที่จริงfetchจะไม่ได้ดำเนินการในบางแพลตฟอร์ม (สะดุดตาในทุกรุ่นของ IE) ซึ่งคุณจำเป็นต้องให้ โพลีฟิลภายนอกต่อไป
Luca Fagioli

3
การเพิ่มความแตกต่างที่กล่าวถึงโดย @ jack123 fetch ยังไม่ได้มีฟังก์ชั่นพื้นฐานของ ajax เช่นtimeout(ซึ่งแปลกมาก) เราต้องใช้โมดูลแยกต่างหากเพื่อใช้ฟังก์ชั่นพื้นฐานนี้
Apurva jain

2
@LucasKatayama ลิงก์ดูเหมือนจะเสียหาย
vancy-pants

30

ตามที่mzabriskie บน GitHub :

โดยรวมแล้วพวกเขาคล้ายกันมาก ประโยชน์บางอย่างของ axios:

  • Transformers: อนุญาตให้ทำการแปลงข้อมูลก่อนที่จะทำการร้องขอหรือหลังจากได้รับการตอบกลับ

  • Interceptors: อนุญาตให้คุณเปลี่ยนคำขอหรือการตอบกลับทั้งหมด (ส่วนหัวเช่นกัน) ดำเนินการ async ก่อนที่จะมีการร้องขอหรือก่อนที่จะตกลงการชำระเงิน

  • การป้องกันXSRFในตัว

โปรดตรวจสอบ Axios การสนับสนุนเบราว์เซอร์

ป้อนคำอธิบายรูปภาพที่นี่

ฉันคิดว่าคุณควรใช้ axios


4
ตกลง Axios ยังนำเข้าขนาดเล็กเพื่อให้ไม่ต้องกังวลมาก - เมื่อเทียบกับสิ่งที่ต้องการด่วนหรือพังพอนที่ถ้าใครเป็นคนบ้าเกี่ยวกับขนาดของแพคเกจพวกเขาอาจจะกังวล :)
CodeFinity

1
โปรดอย่าย้อนกลับการแก้ไขที่ถูกกฎหมายหรือคัดลอกเนื้อหาโดยไม่มีการระบุแหล่งที่มา
jonrsharpe

9

ความแตกต่างที่สำคัญอีกอย่างหนึ่งระหว่างการดึงข้อมูล API และ axios API

  • ขณะใช้งานพนักงานบริการคุณต้องใช้การดึงข้อมูล API เท่านั้นกรณีที่คุณต้องการสกัดกั้นคำขอ HTTP
  • อดีต ขณะทำการแคชใน PWA โดยใช้พนักงานบริการคุณจะไม่สามารถแคชหากคุณใช้ axios API (ใช้งานได้กับ fetch API เท่านั้น)

6
ใครสามารถตรวจสอบว่าเป็นจริงหรือไม่ เป็น 1 คน แต่ upvotes ทั้ง 9 คนเห็นด้วย แต่มันก็ดีที่ได้เห็นความคิดเห็นในเรื่องนี้ (ฉันใช้ axios กับพนักงานบริการ pwa ออฟไลน์คือเหตุผลที่ฉันถาม
Tom Stickel

แน่นอนว่าเราสามารถแสดงความคิดเห็นเพิ่มเติมได้เล็กน้อย แต่ฉันกำลังเผชิญปัญหากับการแคชขณะใช้ axios และเมื่อฉันแทนที่ axios ด้วย fetch () APIs มันได้รับการแก้ไขแล้ว
Vaibhav Bacchav

1
สิ่งนี้ดูเหมือนจะถูกต้อง แต่อาจได้รับการแก้ไขในอนาคตอันใกล้: github.com/axios/axios/pull/2891
arkhz

7

Axios เป็นแพ็คเกจของบุคคลที่สามแบบสแตนด์อะโลนที่สามารถติดตั้งได้ง่ายในโครงการ React โดยใช้ NPM

ตัวเลือกอื่น ๆ ที่คุณกล่าวถึงคือฟังก์ชั่นดึงข้อมูล ต่างจาก Axios ที่fetch()สร้างขึ้นในเบราว์เซอร์ที่ทันสมัยที่สุด ด้วยการดึงข้อมูลคุณไม่จำเป็นต้องติดตั้งแพ็คเกจของบุคคลที่สาม

ดังนั้นขึ้นอยู่กับคุณคุณสามารถไปด้วยfetch()และอาจทำให้สับสนถ้าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่หรือแค่ใช้ Axios ซึ่งตรงไปตรงมามากกว่าในความคิดของฉัน


1
การดึงข้อมูลก็โอเค แต่ Axios เหมือนที่คุณพูด - ตรงไปตรงมามากขึ้น สิ่งที่สร้างไว้ในเบราว์เซอร์สมัยใหม่ (ดึงข้อมูล) นั้นไม่ได้ยอดเยี่ยมสำหรับการเผยแพร่คุณลักษณะ - ดังนั้นฉันชอบ Axios
Tom Stickel

5

นอกจากนี้ ... ฉันกำลังเล่นกับ libs ต่างๆในการทดสอบของฉันและสังเกตเห็นการจัดการคำขอ 4xx ที่แตกต่างกัน ในกรณีนี้การทดสอบของฉันจะส่งคืนวัตถุ json ที่มีการตอบสนอง 400 ครั้ง นี่คือวิธีที่ 3 libs ยอดนิยมจัดการกับการตอบสนอง:

// 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 เหล่านี้มาจากฉันใช้การทดสอบหน่วยซึ่ง (ฉันคิดว่าฉันใช้มอคค่า) มักจะมี.throwsวิธีการทดสอบข้อผิดพลาดที่เกิดขึ้น ในกรณีนี้ฉันกำลังทดสอบการปฏิเสธจาก al 3 libs และสังเกตเห็นความแตกต่างในข้อมูลที่ส่งคืน
cyberwombat

3

ประโยชน์ของ axios:

  • Transformers: อนุญาตให้ทำการแปลงข้อมูลก่อนที่จะทำการร้องขอหรือหลังจากได้รับการตอบกลับ
  • Interceptors: อนุญาตให้คุณเปลี่ยนคำขอหรือการตอบกลับทั้งหมด (ส่วนหัวเช่นกัน) ยังดำเนินการ async ก่อนที่จะมีการร้องขอหรือก่อนที่จะตกลงการชำระเงิน
  • การป้องกัน XSRF ในตัว

ข้อดีaxiosกว่าfetch

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.