Fetch APIとXMLHttpRequest


163

Fetch APIはを使用してPromiseおり、どちらもサーバーへのAJAXリクエストを可能にすることを知っています。

Fetch APIにはいくつかの追加機能があり、それらはXMLHttpRequest(およびに基づいているため、Fetch APIポリフィルでは)使用できないことを読んだことがありますXHR

Fetch APIにはどのような追加機能がありますか?


2
その場で思い出すことはできませんが、XHRでできることはフェッチではできない1つまたは2つあります。あなたは、フェッチには追加の可能性があることを読んだと言いますが、それらが何であるかを言わなければそれらの記事はあまり良くありません
Jaromanda X

2
XHRでできる、フェッチではできない2つのことを発見した...フェッチでリクエストタイムアウトに独自の値を設定することも、進捗イベントを取得することもできない
Jaromanda X

3
Fetchは、ほとんどのタイプのXMLHttpRequestsを簡単に実行できる方法です。ユースケースがFetchの動作に適合する場合は、それを使用してください。すぐに理解してみると、XMLHttpRequest APIは、ほとんどの人がXMLHttpRequest APIを使用する目的には醜いものです。Fetchは、XMLHttpRequestをラップしてライブラリーを美味しくする必要がないような、よりクリーンな方法を提供するための取り組みでした。
jfriend00 2016

1
ブラウザーでの純粋なサポート(caniuse.com/#search=fetch)があるため、ポリフィルがありgithub.com/github/fetch、xhrより上で動作しています
ilyabasiuk

4
@マルコ- 同じことfetch(url).then(function(data) (...));XMLHttpRequestするのに使うよりも簡単でないとどうして言えないのですか?それは他の多くの機能を持っているかもしれませんが、まあ、それは確かに一般的なものに使用する方が簡単です。クリーンアップされたAPIです。
jfriend00

回答:


120

XHRではなくフェッチで実行できることがいくつかあります。

  • リクエストオブジェクトとレスポンスオブジェクトでCache 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.memdn.github.io / dom-examples / abort-api。そして、オープンクローム&Webkitの機能のバグがあるbugs.chromium.org/p/chromium/issues/detail?id=750599bugs.webkit.org/show_bug.cgi?id=174980を。使い方:developers.google.com/web/updates/2017/09/abortable-fetchdeveloper.mozilla.org/en-US/docs/Web/API/AbortSignal#Examples。そして、stackoverflow.com
a / 47250621/441757

1
もう1つの違いは、fetchリクエストをデベロッパーツールで再生できないことです。
Parziphal

そして、私の経験から、fetchファイルを要求することはできますが、XHRはできません。
D.パーダル

64

フェッチ

  • ドキュメントを消費するための組み込みメソッドがありません
  • タイムアウトを設定する方法はまだありません
  • content-type応答ヘッダーを上書きできません
  • content-lengthレスポンスヘッダーは存在するが公開されていない場合、ストリーミング中に本文の全長は不明です
  • 要求が完了した場合でも、シグナルの中止ハンドラを呼び出します
  • アップロードの進行なし(ReadableStreamリクエストボディがまだ来ていないため、インスタンスのサポート)

XHR

  • Cookieを送信しない方法はありません非標準のmozAnonフラグまたはAnonXMLHttpRequestコンストラクターを使用することを除いて)
  • FormDataインスタンスを返すことができません
  • fetchno-corsモードに相当するものがありません
  • 常にリダイレクトに従う

13
fetch進捗状況もありません。XHRを使用すると、progressイベントの進行状況を追跡できます
rzr 2017

1
「応答のcontent-typeヘッダーを上書きすることはできません」...これは、最初から悪い考えです。'content-typeは何を返すかを指示し、BACKENDはそれをフロントエンドに指示する必要があります。実際には、要求されるのは返されるべきものなので、content-typeはtypeの「ONLY HEADER」である必要があります。特別なサブドメインなどから何か別のサーブが必要な場合は、特定の機能を個別に処理できます。みんなの喉の99%を1%のルールで強制しようとしています。
Orubel

@Knuはい、これでより高度になり、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.