Fetch API와 XMLHttpRequest


163

Fetch API가 Promises를 사용 하고 둘 다 서버에 AJAX 요청을 수행 할 수 있음을 알고 있습니다.

Fetch API에는 XMLHttpRequest(및 Fetch API polyfill을 기반으로하므로) 사용할 수없는 몇 가지 추가 기능이 있음을 읽었습니다 XHR.

Fetch API에는 어떤 추가 기능이 있습니까?


2
그 자리에서 기억할 수는 없지만 가져 오기로는 할 수없는 XHR로 할 수있는 한두 가지가 있습니다. 가져 오기에 추가 가능성이 있다는 것을 읽었다 고 말하면, 기사가 무엇인지 말하지 않으면 그 기사가 그리 좋지 않습니다
Jaromanda X

2
페치로 할 수없는 두 가지를 XHR로 할 수있는 것을 발견했습니다. 페치에서 요청 시간 초과에 대한 고유 한 값을 설정할 수 없으며 진행 이벤트도받을 수 없습니다.
Jaromanda X

3
Fetch는 대부분의 XMLHttpRequest 유형에 대해 작업을 수행하는 간단한 방법입니다. 사용 사례가 Fetch의 기능에 적합하면 사용하십시오. XMLHttpRequest API는 대부분의 사람들이 사용하는 것에 적합하지 않습니다. Fetch는 XMLHttpRequest를 감싸서 라이브러리를 필요로하지 않는 작업을보다 깔끔하게 수행하기 위해 노력했습니다.
jfriend00

1
그것은 브라우저 (순수 지원이 caniuse.com/#search=fetch을 ), 그래서에 대한 polifill이 github.com/github/fetch XHR 이상으로 노력하고 느릅 나무,
ilyabasiuk

4
@Marco- 같은 일을하는 것 fetch(url).then(function(data) (...));보다 간단 하지 않다고 어떻게 말할 수 XMLHttpRequest있습니까? 그것은 다른 많은 기능을 가지고 있지만 간헐적으로 일반적인 것들에 사용하는 것이 더 간단합니다. 정리 된 API입니다.
jfriend00

답변:


120

XHR이 아닌 페치로 수행 할 수있는 몇 가지 작업이 있습니다.

  • 요청 및 응답 오브젝트와 함께 캐시 API를 사용할 수 있습니다.
  • no-corsCORS를 구현하지 않는 서버에서 응답을 받아 요청 을 수행 할 수 있습니다 . JavaScript에서 직접 응답 본문에 액세스 할 수는 없지만 다른 API (예 : 캐시 API)와 함께 사용할 수 있습니다.
  • 스트리밍 응답 (XHR을 사용하면 전체 응답이 메모리에 버퍼링되며 가져 오기를 사용하면 하위 레벨 스트림에 액세스 할 수 있음). 아직 모든 브라우저에서 사용할 수는 없지만 곧 제공 될 예정입니다.

XHR로 할 수있는 일이 몇 가지 있지만 아직 가져 오기로는 할 수 없지만 조만간 사용할 수있게됩니다 ( "미래의 개선 사항"단락을 읽으십시오 : https : //hacks.mozilla .org / 2015 / 03 / this-api-is-so-fetching / ) :

  • 요청을 중단합니다 (@sideshowbarker가 그의 설명에서 설명하는 것처럼 Firefox 및 Edge에서 작동 함).
  • 진행 상황을보고하십시오.

이 기사 https://jakearchibald.com/2015/thats-so-fetch/ 에는 자세한 설명이 포함되어 있습니다.


1
Fetch API의 스펙은 이제 취소를 제공합니다. 지원은 지금까지 Firefox 57 및 Edge 16에서 제공되었습니다 . 데모 : fetch-abort-demo-edge.glitch.me , mdn.github.io/dom-examples/abort-api . 또한 열린 Chrome 및 웹킷 기능 버그 bugs.chromium.org/p/chromium/issues/detail?id=750599 , bugs.webkit.org/show_bug.cgi?id=174980이 있습니다. 사용 방법 : developers.google.com/web/updates/2017/09/abortable-fetch , developer.mozilla.org/en-US/docs/Web/API/AbortSignal#Examples . 그리고 stackoverflow.com/a/47250621/441757
sideshowbarker

1
또 다른 차이점은 fetch개발자 도구에서 요청을 재생할 수 없다는 것입니다.
Parziphal

내 경험으로 fetch는 파일을 요청할 수 있지만 XHR은 파일을 요청할 수 없습니다.
D. Pardal

64

술책

  • 문서를 소비하는 기본 제공 방법이 없습니다.
  • 아직 시간 초과를 설정할 방법이 없습니다
  • 콘텐츠 유형 응답 헤더를 재정의 할 수 없습니다
  • 콘텐츠 길이 응답 헤더가 있지만 노출되지 않은 경우 스트리밍하는 동안 본문의 전체 길이를 알 수 없습니다.
  • 요청이 완료된 경우 에도 신호의 중단 처리기를 호출합니다.
  • 업로드 진행률 없음 ( ReadableStream요청 기관이 아직없는 인스턴스 지원 )

XHR

  • 쿠키를 보내지 않는 방법은 없습니다 ( 비표준 mozAnon플래그 또는 AnonXMLHttpRequest생성자 를 사용하는 것 제외 )
  • FormData인스턴스를 반환 할 수 없습니다
  • fetchno-cors모드 와 동일하지 않습니다
  • 항상 리디렉션을 따르십시오

13
fetch진행률이 누락되었습니다. XHR로 progress이벤트 진행 상황을 추적 할 수 있습니다
rzr

1
"응답의 내용 유형 헤더를 무시할 수 없습니다"... 이것은 단지 나쁜 생각입니다. 'content-type은 무엇이 반환 될 것인지를 지시하고 백엔드는 그것을 프론트 엔드에 지시해야한다. FACT에서, content-type은 요청 된 것이 리턴되어야하는 것이기 때문에 type의 'ONLY HEADER'이어야합니다. 특별한 하위 도메인과 다른 서비스를 원하면 특정 기능을 별도로 처리 할 수 ​​있습니다. 당신은 모든 사람의 목구멍의 99 %를 1 % 규칙으로 강요하려고합니다.
Orubel

@Knu yep과 이제 우리는 더욱 발전했으며 90 % 솔루션을 쉽게 자동화 할 수 있으며 괴물 사건이 다른 기능으로 라우팅되도록 할 수 있습니다.
Orubel

1
@rzr은 정확하지 않습니다 Response#body.
Knu

9

위의 답변은 훌륭하고 통찰력을 제공하지만이 Google 개발자 블로그 항목 에서 공유 한 것과 동일한 의견을 공유 합니다 (실제적인 관점에서) 주요 차이점은에서 제공 된 기본 약속의 편리함입니다.fetch

이와 같은 코드를 작성하는 대신

function reqListener() {
    var data = JSON.parse(this.responseText);
}

function reqError(err) { ... }

var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();

약속과 현대적인 문법으로 정리하고 좀 더 간결하고 읽기 쉬운 것을 쓸 수 있습니다

fetch('./api/some.json')
    .then((response) => {
        response.json().then((data) => { 
            ... 
        });
    })
    .catch((err) => { ... });

8
@TheOpti 기본 가져 오기 지원을 IE 11에 폴리 필 할 수 있습니다. 또한 많은 사용자 기반 에서처럼 IE 11의 사용률이 1 % 미만인 것처럼 IE11을 지원되는 브라우저로 드롭 할 수도 있습니다.
데본 홀콤
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.