Sự khác biệt giữa Axios và Fetch là gì?


182

Tôi đang gọi dịch vụ web bằng cách sử dụng tìm nạp nhưng tôi cũng có thể làm như vậy với sự trợ giúp của các axios. Vì vậy, bây giờ tôi bối rối. Tôi nên đi cho một trong hai axios hoặc tìm nạp?


4
Tôi nghĩ rằng điều này đã được thảo luận rất chi tiết trên github.com/mzabriskie/axios/issues/314
Jaydeep Solanki

Câu trả lời:


164

Fetch và Axios có chức năng rất giống nhau, nhưng để tương thích ngược hơn, Axios dường như hoạt động tốt hơn (ví dụ như tìm nạp không hoạt động trong IE 11, hãy kiểm tra bài đăng này )

Ngoài ra, nếu bạn làm việc với các yêu cầu JSON, sau đây là một số khác biệt mà tôi tình cờ gặp phải.

Lấy yêu cầu bài viết 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
}

Yêu cầu bài viết của 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
}

Vì thế:

  • Tìm nạp cơ thể = dữ liệu của Axios
  • Cơ thể của Fetch phải được xâu chuỗi , dữ liệu của Axios chứa đối tượng
  • Tìm nạp không có url trong đối tượng yêu cầu, Axios có url trong đối tượng yêu cầu
  • Chức năng yêu cầu tìm nạp bao gồm url dưới dạng tham số , chức năng yêu cầu Axios không bao gồm url làm tham số .
  • Yêu cầu tìm nạp là ok khi đối tượng phản hồi chứa thuộc tính ok , yêu cầu Axios vẫn ổn khi trạng thái là 200statusText là 'OK'
  • Để có được phản hồi của đối tượng json: trong tìm nạp, hãy gọi hàm json () trên đối tượng phản hồi, trong Axios lấy thuộc tính dữ liệu của đối tượng phản hồi.

Hi vọng điêu nay co ich.


Đây là câu hỏi nhiều hơn. Khi answerOk là đúng, chúng ta có cần kiểm tra trạng thái trong answer.data nếu nó có trạng thái được cung cấp không? cảm ơn
Yang Wang

1
Axios request is ok when status is 200 and statusText is 'OK' Còn các httpStatus khác trong phạm vi 2xx như 201 hoặc 204 thì sao?
leonbloy

46

Chúng là các thư viện yêu cầu HTTP ...

Tôi kết thúc với cùng một nghi ngờ nhưng bảng trong bài này làm cho tôi đi với isomorphic-fetch. Đó là fetchnhưng hoạt động với NodeJS.

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


Liên kết ở trên đã chết Bảng tương tự ở đây: https : //www.javascript ware.com/ajax-lologists/

Hoặc ở đây: nhập mô tả hình ảnh ở đây


6
Tuy nhiên, tôi không thể tìm thấy lợi ích của việc tìm nạp trên các axios. Bạn có thể có bất kỳ ý tưởng tại sao tôi nên đi với các axios?
Gorakh Nath

4
Tôi nghĩ rằng tìm nạp là một tiêu chuẩn xem fetch.spec.whatwg.org ... axios có thể có nhiều tính năng hơn vì nó không tuân theo điều đó .... Tôi nghĩ cuối cùng họ làm những điều cơ bản (yêu cầu ajax http) nhưng nó phụ thuộc về những gì bạn cần ... Tôi không cần máy biến áp ... vì vậy, có được một lib tiêu chuẩn là chuyên nghiệp ...
Lucas Katayama

4
Hãy nhận biết rằng bảng đó là sai lệch. Nó định nghĩa fetchnhư Native ( Có nghĩa là bạn chỉ có thể sử dụng nó - không cần phải bao gồm thư viện , phù hợp với nguồn bảng), trong khi trên thực tế fetchkhông được thực hiện ở một số nền tảng (đặc biệt là trong tất cả các phiên bản của IE), mà bạn cần phải cung cấp một polyfill bên ngoài nào.
Luca Fagioli

3
Thêm vào sự khác biệt được đề cập bởi @ jack123 fetch cũng không cung cấp chức năng ajax cơ bản như timeout(rất kỳ lạ), chúng ta phải sử dụng một mô-đun riêng để thực hiện chức năng cơ bản này.
Apurva

2
@LucasKatayama Liên kết dường như bị hỏng
vancy-pants

30

Theo mzabriskie trên GitHub :

Nhìn chung chúng rất giống nhau. Một số lợi ích của axios:

  • Transformers: cho phép thực hiện các biến đổi trên dữ liệu trước khi yêu cầu được thực hiện hoặc sau khi nhận được phản hồi

  • Đánh chặn: cho phép bạn thay đổi hoàn toàn yêu cầu hoặc phản hồi (cả tiêu đề). đồng thời, thực hiện các hoạt động không đồng bộ trước khi yêu cầu được thực hiện hoặc trước khi Promise giải quyết

  • Built-in XSRF bảo vệ

vui lòng kiểm tra Axios hỗ trợ trình duyệt

nhập mô tả hình ảnh ở đây

Tôi nghĩ bạn nên sử dụng axios.


4
Đã đồng ý. Axios cũng là một nhập khẩu nhỏ, do đó sự phình to không đáng lo ngại - trái ngược với thứ gì đó như express hoặc cầy mang nếu một người hơi điên về kích thước gói, họ có thể lo ngại. :)
CodeFinity

1
Vui lòng không hoàn nguyên các chỉnh sửa hợp pháp hoặc sao chép nội dung mà không ghi công.
jonrsharpe

9

Thêm một sự khác biệt lớn giữa API tìm nạp & API axios

  • Trong khi sử dụng nhân viên dịch vụ, bạn chỉ phải sử dụng API tìm nạp nếu bạn muốn chặn yêu cầu HTTP
  • Ví dụ. Trong khi thực hiện lưu trữ bộ đệm trong PWA bằng nhân viên dịch vụ, bạn sẽ không thể lưu vào bộ đệm nếu bạn đang sử dụng API axios (nó chỉ hoạt động với API tìm nạp)

6
Bất cứ ai có thể xác minh điều này là thực sự đúng? Đó là 1 người, nhưng 9 người ủng hộ dường như đồng ý nhưng thật tuyệt khi thấy những bình luận về điều này (Tôi đang sử dụng axios với nhân viên dịch vụ ngoại tuyến là lý do tại sao tôi hỏi.
Tom Stickel

Chắc chắn, chúng ta có thể có thêm vài bình luận về vấn đề này nhưng tôi đã gặp phải vấn đề với bộ nhớ đệm trong khi sử dụng axios và khi tôi thay thế axios bằng API fetch () nó đã được giải quyết
Vaibhav Bacchav

Điều này có vẻ đúng, nhưng có thể sẽ được khắc phục trong tương lai gần: github.com/axios/axios/pull/2891
arkhz

7

Axios là gói bên thứ 3 độc lập có thể dễ dàng cài đặt vào dự án React bằng NPM.

Tùy chọn khác mà bạn đề cập là chức năng tìm nạp. Không giống như Axios, fetch()được tích hợp vào hầu hết các trình duyệt hiện đại. Với tìm nạp, bạn không cần phải cài đặt gói bên thứ ba.

Vì vậy, tùy thuộc vào bạn, bạn có thể đi cùng fetch()và có khả năng gây rối nếu bạn không biết những gì bạn đang làm HOẶC chỉ sử dụng Axios, điều này đơn giản hơn theo quan điểm của tôi.


1
Tìm nạp là ok, nhưng Axios giống như bạn đã nói - đơn giản hơn. Cái được tích hợp trong các trình duyệt hiện đại (tìm nạp) không phải là tuyệt vời cho các bản phát hành tính năng. - vì vậy tôi thích Axios hơn
Tom Stickel

5

Ngoài ra ... Tôi đã chơi xung quanh với nhiều lib khác nhau trong thử nghiệm của mình và nhận thấy cách xử lý khác nhau của các yêu cầu 4xx. Trong trường hợp này, thử nghiệm của tôi trả về một đối tượng json với phản hồi 400. Đây là cách 3 lib phổ biến xử lý phản hồi:

// 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)

Quan tâm là điều đó request-promise-nativeaxiosđưa ra phản hồi 4xx trong khi node-fetchkhông. Cũng fetchsử dụng một lời hứa cho phân tích json.


1
@baitun đây là từ tôi chạy thử nghiệm đơn vị mà (tôi nghĩ rằng tôi đang sử dụng Mocha) thường có một .throwsphương pháp để kiểm tra lỗi ném. Trong trường hợp này, tôi đã thử nghiệm các từ chối từ al 3 libs và nhận thấy sự khác biệt trong dữ liệu được trả về.
cyberwombat

3

Lợi ích của axios:

  • Transformers: cho phép thực hiện các biến đổi trên dữ liệu trước khi yêu cầu được thực hiện hoặc sau khi nhận được phản hồi
  • Đánh chặn: cho phép bạn thay đổi hoàn toàn yêu cầu hoặc phản hồi (cả tiêu đề). cũng thực hiện các hoạt động không đồng bộ trước khi yêu cầu được thực hiện hoặc trước khi Promise giải quyết
  • Bảo vệ XSRF tích hợp

Ưu điểm của axioshơnfetch

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.