Axios ou fetch(): 무슨 문제 있는 거 아니야?

39591 단어
에세 아티고 우마 트라두ço livre de Axios or fetch(): Which should you use?Faraz Kelhini.
Em minha recente postagem'Como fazer requests como um profissional usando Axios'은 EU가 미국 도서관의 이점에 대해 논의했다.그럼에도 불구하고 중요한 군도는 기존의 군도 조작 요구(요청)인 HTTP의 무기다.
다음 질문에서는 alguns desenvolvedores가 Axios와 invés de APIs internas를 더 선호합니다.오늘은 나의 생일이며, 우리가 도서관을 읽는 데 필요한 조건이다.API fetch()은 악시오스의 주요 기능으로 현대 내비게이션 장비를 제공한다.
아티고 부인, Seráfeito o Comparativo Enter usar o fetch() e Axios, vendo como podem ser usados Differentes usos.Espero que, ao final do artigo, voc en possater uma compeens o melhor de ambas를 API로 사용합니다.

문법
Avançadas do Axios의 기능에 대해 우리는 문법 Básica com o queéusado no fetch()을 사용할 수 있다.O 예 a seguir mostra como fazer uma는 usando Axios com cabeçalhos 맞춤형(맞춤형 제목)을 요청합니다.O Axios converte automaticamente a resposta para JSON,para que vocènãO Precision fazer isso.
// axios
const options = {
  url: 'http://localhost/test.htm',
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json;charset=UTF-8'
  },
  data: {
    a: 10,
    b: 20
  }
};
axios(options)
  .then(response => {
    console.log(response.status);
  });
Agora는 esse código com o que usaremos no fetch(),que produziráo mesmo resultado:
// fetch()

const url = 'http://localhost/test.htm';
const options = {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json;charset=UTF-8'
  },
  body: JSON.stringify({
    a: 10,
    b: 20
  })
};

fetch(url, options)
  .then(response => {
    console.log(response.status);
  });
페시바 규:
  • Para enviar dados, o fetch() usa는'몸', enquanto Axios faz uso는'데이터'입니다.
  • Os dados enviados pelo fetch() devem estar stringuificados (현화)
  • fetch()호 의논문.Axios, entertanto, URL faz parte do convento de valores가 없고 옵션이 없습니다.

  • 앞의 배합
    응, 우리는 나비카도레스를 지지해야 해.이것은 사람을 곤혹스럽게 하는 문제다.O fetch(), por outro lado, apenasésuportado pelo Chrome 42+, Firefox 39+, Edge 14+, e Safari 10.1+(웹 사이트 지원 없는 tabela completa-de-Support-no site-Can I use의 voc e pode 버전).
    이것은 호환 가능한 개념이고 도서관 HTTP이기 때문에 합리적인 해석이다.필요하면 fetch() com um polyfill como esse para implementar uma functionalidadadade와 유사한 em navegadores que n n que o suportam seu uso를 사용하십시오.Para fazer uso desse polyfill, faça sua instala çonpm através do comando:
    npm install whatwg-fetch --save
    
    Aípra fazer uma requestésófazer assim:
    import 'whatwg-fetch'
    window.fetch(...)
    
    이것은 좋은 선택이다. 왜냐하면 그것은 좋은 선택이기 때문이다.

    응답 시간 초과(응답 시간 초과)
    이것은 우리의 신제품인 투자 fetch() 같은 간단한 방법이 없는 간단한 방법이다.Axios가 없으면voc弊pode usar a opèo timeout은 요구사항을 충족시키기 위해 정보와 시간을 설정하는 목표가 없습니다.예:
    axios({
      method: 'post',
      url: '/login',
      timeout: 4000, // 4 segundos timeout
      data: {
        firstName: 'David',
        lastName: 'Pollock'
      }
    })
    .then(response => {/* tratamento da resposta */})
    .catch(error => console.error('timeout excedido'))
    
    Fetch()은atravésda인터페이스와 유사한 기능 AbortController을 제공했다.Nãoésimples como no Axios,masépossível:
    const controller = new AbortController();
    const options = {
      method: 'POST',
      signal: controller.signal,
      body: JSON.stringify({
        firstName: 'David',
        lastName: 'Pollock'
      })
    };
    const promise = fetch('/login', options);
    const timeoutId = setTimeout(() => controller.abort(), 4000);
    promise
      .then(response => {/* tratamento da resposta */})
      .catch(error => console.error('timeout excedido'));
    
    Aquinós criamos o AbortController, 허가 요청이 없습니다. 전용 signaléapenas de leitura(읽기만 가능), provendo meios de se comunicar Comuma가 포기를 요청합니다.servidor não responder nada em até4 segundos,o controller.abort() seráchamado,encerrando a operaão.

    Conversão em JSON automática
    사전 준비 단계에서 Axios stringuifica(stringifies)는nas 요청(voc en também pode sobrescrever o compartamento padr ão e criar um meio de transformar o dado)을 자동으로 충족합니다.Quando usamos fetch() vocyen precisa fazer isso 설명서.비아:
    // axios
    axios.get('https://api.github.com/orgs/axios')
      .then(response => {
        console.log(response.data);
      }, error => {
        console.log(error);
      });
    // fetch()
    fetch('https://api.github.com/orgs/axios')
      .then(response => response.json())    // passo extra
      .then(data => {
        console.log(data)
      })
      .catch(error => console.error(error));
    
    이것은 기능적인 회의로 새해에는 fetch()년에 열린다.

    차단기 HTTP(HTTP 차단기)
    우리의 주요 기능은 요청(요청) HTTP를 차단하는 것입니다.에스세스는 세인트오테스의 자격심사원과 HTTP를 요구하는 다른 사람들을 캡처했고 반대로도 (예를 들어 로그, autenticaço 등) 그랬다.우리의 압수 작전은 HTTP의 요구를 만족시키기 위한 것이다.
    이것은 차단기에 대한 성명이다.
    axios.interceptors.request.use(config => {
      // loga(log) uma mensagem antes da requisição HTTP ser enviada
      console.log('A requisição foi enviada');
      return config;
    });
    // faz uma requisição GET
    axios.get('https://api.github.com/users/sideshowbarker')
      .then(response => {
        console.log(response.data);
      });
    
    똑뚜기 acima, ométodo axios.interceptors.request.use()éusado para definir um código que será executado ante que a requisi ão HTTP://seja enviada.
    O fetch()년에 이 프로젝트의 주요 목적은 프로젝트의 순조로운 진행을 확보하고 프로젝트의 순조로운 진행을 확보하는 것이다.전 세계적으로 이것은 좋은 해결 방안으로 차단자, 코모 모스트라도 아바이오(como mostrado abaixo):
    fetch = (originalFetch => {
      return (...arguments) => {
        const result = originalFetch.apply(this, arguments);
          return result.then(console.log('A requisição foi enviada'));
      };
    })(fetch);
    fetch('https://api.github.com/orgs/axios')
      .then(response => response.json())
      .then(data => {
        console.log(data)
      });
    

    다운로드 진행
    진보지표인 세인트베몬테스 카레가모스 무이토스 자산회사, 인터넷회사 최고경영자.Anteriormente, 운영 체제 프로그램은 Javascript faziam uso 콜백 XMLHttpRequest.onprogress 두 번째 구현 프로세스를 지원합니다.
    API do Fetch não tem uma método onprogress para tratar esse caso.조사에서 ReadableStream 아틀라웨 연구소는 반응을 조사하지 않았다.
    O 시범 시범 Ouso do body 보조 검증 aos usuários um 피드백 imediato durando O 다운로드 이미지:
    // código original: https://github.com/AnthumChris/fetch-progress-indicators
    <div id="progress" src="">progress</div>
    <img id="img">
    <script>
    'use strict'
    const element = document.getElementById('progress');
    fetch('https://fetch-progress.anthum.com/30kbps/images/sunrise-baseline.jpg')
      .then(response => {
        if (!response.ok) {
          throw Error(response.status+' '+response.statusText)
        }
        // tenha certeza que o ReadableStream é suportado
        if (!response.body) {
          throw Error('ReadableStream not yet supported in this browser.')
        }
        // armazene o tamanho da entity-body em bytes
        const contentLength = response.headers.get('content-length');
        // garanta que o contentLength está disponível
        if (!contentLength) {
          throw Error('Content-Length response header unavailable');
        }
        // converta o integer em um número de base 10
        const total = parseInt(contentLength, 10);
        let loaded = 0;
        return new Response(
          // cria e retorna um readable stream
          new ReadableStream({
            start(controller) {
              const reader = response.body.getReader();
              read();
              function read() {
                reader.read().then(({done, value}) => {
                  if (done) {
                    controller.close();
                    return;
                  }
                  loaded += value.byteLength;
                  progress({loaded, total})
                  controller.enqueue(value);
                  read();
                }).catch(error => {
                  console.error(error);
                  controller.error(error)
                })
              }
            }
          })
        );
      })
      .then(response =>
        // construa um blob a partir da data
        response.blob()
      )
      .then(data => {
        // insira a imagem carregada na página
        document.getElementById('img').src = URL.createObjectURL(data);
      })
      .catch(error => {
        console.error(error);
      })
    function progress({loaded, total}) {
      element.innerHTML = Math.round(loaded/total*100)+'%';
    }
    </script>
    
    실시 과정에서 너는 유사한 간단한 방법을 사용할 수 있다. 특히 Axios Progress Bar.이 예는 다음과 같습니다.
    <link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/rikmms/progress-bar-4-axios/0a3acf92/dist/nprogress.css" />
    <script src="https://cdn.rawgit.com/rikmms/progress-bar-4-axios/0a3acf92/dist/index.js"></script>
    
    Aívocêpode começar A implementar A barra de progresso,como visto abaixo:
    <img id="img">
    <script>
    loadProgressBar();
    const url = 'https://fetch-progress.anthum.com/30kbps/images/sunrise-baseline.jpg';
    function downloadFile(url) {
      axios.get(url, {responseType: 'blob'})
        .then(response => {
          const reader = new window.FileReader();
          reader.readAsDataURL(response.data);
          reader.onload = () => {
            document.getElementById('img').setAttribute('src', reader.result);
          }
        })
        .catch(error => {
          console.log(error)
        });
    }
    downloadFile(url);
    </script>
    
    API ReadableStream에서 꼬꼬 faz uso da a forma ass荐ncrona leráo arquivo a imagem baixada.O método FileReader Retrona a imagem com O encode Base64,que seráinserida no atributo readAsDataURL da tag src para exibi-lá.

    요청 시뮬레이션
    Axios는 여러 요청을 동시에 실행하기 위해 img 메소드를 제공합니다.이 메서드에 요청 배열을 전달한 다음 axios.all()을 사용하여 응답 배열의 속성을 개별 변수에 할당합니다.
    axios.all([
      axios.get('https://api.github.com/users/iliakan'),
      axios.get('https://api.github.com/users/taylorotwell')
    ])
    .then(axios.spread((obj1, obj2) => {
      // Ambas requests foram finalizadas
      console.log(obj1.data.login + ' has ' + obj1.data.public_repos + ' public repos on GitHub');
      console.log(obj2.data.login + ' has ' + obj2.data.public_repos + ' public repos on GitHub');
    }));
    
    Vocêconsegue o mesmo resultado fazendo uso do método axios.spread().둘째, 소바 파사르 수아스가 어레이 어레이에 대한 테스트를 요청했는데 그 결과 Promise.all(), e em seguida, lide coma resposta comuma funçao assmincrona, como o o Examplo abaixo:
    Promise.all([
      fetch('https://api.github.com/users/iliakan'),
      fetch('https://api.github.com/users/taylorotwell')
    ])
    .then(async([res1, res2]) => { //async function
      const a = await res1.json();
      const b = await res2.json();
      console.log(a.login + ' has ' + a.public_repos + ' public repos on GitHub');
      console.log(b.login + ' has ' + b.public_repos + ' public repos on GitHub');
    })
    .catch(error => {
      console.log(error);
    });
    

    세인트폴
    O Axios fornece uma API fácil de usar um pacote compacto a maioria das suas necessidades de comunicaçO HTTP.Entato는 없으며 ficar com API nativas, nada, Axios를 선호합니다.
    O Axios for nece uma API bem fácil de usar de um pacote compacto que vocèpoderáusar a maioria das suas necessidades de comunicaèO HTTP.따라서 우리는 레이저 레이더를 사용하여 국가의 목표를 실현하기를 더욱 원한다.
    예술성에 부합하는 토론은 온라인상의 네시도 펠로스 navegadores에 원칙적인 재현을 제공한다.fim에서는 고객에게 최신 API를 제공하고 최신 내부 API를 제공합니다.
    예술 규범을 준수하고 원칙을 준수하며 규칙을 준수하고 규칙을 준수한다.마지막으로, 우리는 통일된 HTTP, 통일된 vocèfazer, 국제 API가 필요하다.

    좋은 웹페이지 즐겨찾기