Qual é a diferença entre Axios e Fetch?


Respostas:


164

A busca e o Axios são muito semelhantes em funcionalidade, mas para obter mais compatibilidade com versões anteriores, o Axios parece funcionar melhor (a busca não funciona no IE 11, por exemplo, verifique esta publicação )

Além disso, se você trabalha com solicitações JSON, a seguir, apresentamos algumas diferenças.

Buscar solicitação de postagem 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
}

Solicitação de postagem JSON do Axios

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
}

Assim:

  • Corpo da busca = dados do Axios
  • O corpo de Fetch deve ser especificado , os dados do Axios contêm o objeto
  • A busca não possui URL no objeto de solicitação, o Axios possui URL no objeto de solicitação
  • A função de solicitação de busca inclui a URL como parâmetro , a função de solicitação do Axios não inclui a URL como parâmetro .
  • A solicitação de busca está ok quando o objeto de resposta contém a propriedade ok , a solicitação do Axios está ok quando o status é 200 e statusText é 'OK'
  • Para obter a resposta do objeto json: na busca, chame a função json () no objeto de resposta, no Axios obtenha a propriedade de dados do objeto de resposta.

Espero que isto ajude.


Aqui está mais uma pergunta. Depois que responseOk for verdadeiro, precisamos verificar o status em response.data se ele tiver o status fornecido? obrigado
Yang Wang

1
Axios request is ok when status is 200 and statusText is 'OK' E quanto a outros httpStatus no intervalo 2xx como 201 ou 204?
leonbloy

46

Eles são bibliotecas de solicitações HTTP ...

Acabo com a mesma dúvida, mas a tabela deste post me faz seguir em frente isomorphic-fetch. Que é fetchapenas funciona com o NodeJS.

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


O link acima está inativo A mesma tabela está aqui: https://www.javascriptstuff.com/ajax-libraries/

Ou aqui: insira a descrição da imagem aqui


6
Ainda não consigo encontrar o benefício de buscar por axios. Você tem alguma idéia de por que eu deveria ir com os axios?
Gorakh Nath

4
Eu acho que a busca é um padrão, veja fetch.spec.whatwg.org ... axios poderia ter mais recursos porque não segue isso .... Acho que no final eles fazem o básico (solicitação http ajax), mas depende sobre o que você precisa ... Eu não precisava de um transformador ... para obter um lib padrão é um pro ...
Lucas Katayama

4
Esteja ciente de que essa tabela é enganosa. Ele define fetchcomo Nativo (o que significa que você pode simplesmente usá-lo - não é necessário incluir uma biblioteca , de acordo com a origem da tabela), enquanto na verdade nãofetch é implementado em algumas plataformas (principalmente em todas as versões do IE), para as quais você precisa fornecer um polyfill externo de qualquer maneira.
Luca Fagioli

3
Além da diferença mencionada pelo @ jack123 fetch, também não fornece uma funcionalidade básica do ajax, como timeout(o que é muito estranho), precisamos usar um módulo separado para implementar essa funcionalidade básica.
Apurva jain

2
@LucasKatayama O link parece estar quebrado
vancy-pants 8/08

30

De acordo com mzabriskie no GitHub :

No geral, eles são muito semelhantes. Alguns benefícios dos axios:

  • Transformadores: permitem realizar transformações nos dados antes de uma solicitação ser feita ou após o recebimento de uma resposta

  • Interceptores: permitem alterar completamente a solicitação ou resposta (também os cabeçalhos). Além disso, execute operações assíncronas antes que uma solicitação seja feita ou antes que o Promise seja resolvido

  • Built-in XSRF proteção

verifique o Axios de suporte ao navegador

insira a descrição da imagem aqui

Eu acho que você deveria usar axios.


4
Acordado. O Axios também é uma importação insuficiente, de modo que o inchaço não é muito preocupante - ao contrário de algo como express ou mangusto, onde se alguém estiver um pouco louco com o tamanho do pacote, eles podem estar preocupados. :)
CodeFinity 13/08

1
Não reverta edições legítimas nem copie conteúdo sem atribuição.
jonrsharpe

9

Mais uma grande diferença entre a API de busca e a API de axios

  • Ao usar o service worker, você precisará usar a API de busca apenas se desejar interceptar a solicitação HTTP
  • Ex. Ao executar o cache no PWA usando o service worker, você não poderá armazenar em cache se estiver usando a API axios (funciona apenas com a API de busca)

6
Alguém pode verificar se isso é realmente verdade? É uma pessoa, mas os 9 upvotes parecem concordar ainda que seria bom para ver comentários sobre esta (estou usando Axios com trabalhador de serviço pwa off-line é por isso que peço.
Tom Stickel

Claro, podemos ter mais alguns comentários sobre isso, mas eu estava enfrentando problemas com o cache enquanto usava axios e quando substituí o axios pelas APIs fetch () que foram resolvidas
Vaibhav Bacchav

Isso parece estar correto, mas pode ser corrigido em um futuro próximo: github.com/axios/axios/pull/2891
arkhz

7

O Axios é um pacote independente de terceiros que pode ser facilmente instalado em um projeto React usando o NPM.

A outra opção que você mencionou é a função de busca. Ao contrário do Axios, fetch()é incorporado aos navegadores mais modernos. Com a busca, você não precisa instalar um pacote de terceiros.

Portanto, cabe a você, você pode ir fetch()e potencialmente bagunçar se não souber o que está fazendo OU apenas usar o Axios, que é mais direto na minha opinião.


1
Buscar é bom, mas o Axios é como você disse - mais direto. O que é incorporado aos navegadores modernos (busca) não é tão bom para lançamentos de recursos. - então prefiro Axios
Tom Stickel

5

Além disso ... eu estava brincando com várias bibliotecas no meu teste e notei o tratamento diferente das solicitações 4xx. Nesse caso, meu teste retorna um objeto json com uma resposta de 400. É assim que três bibliotecas populares lidam com a resposta:

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

De interesse é isso request-promise-nativee axiosjogar na resposta 4xx enquanto node-fetchnão. Também fetchusa uma promessa para a análise de json.


1
@baitun estes são meus, executando testes de unidade que (acho que estava usando o Mocha) geralmente têm um .throwsmétodo para testar erros gerados. Nesse caso, eu estava testando rejeições de todas as 3 libs e percebi a diferença nos dados retornados.
51318 cyberwombat

3

Benefícios dos axios:

  • Transformadores: permitem realizar transformações nos dados antes que a solicitação seja feita ou após a resposta ser recebida
  • Interceptores: permitem alterar completamente a solicitação ou resposta (também os cabeçalhos). Também execute operações assíncronas antes que a solicitação seja feita ou antes que o Promise seja resolvido
  • Proteção XSRF integrada

Vantagens de axiosmais defetch

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.