fetch()
を使用すると、XMLHttpRequest(XHR)に似たネットワーク リクエストを行うことができます。主な違いは、Fetch API が Promise を使用することです。Promise は API がシンプルで、XMLHttpRequest API の複雑なコールバックを回避できます。
Promise を使用したことがない場合は、JavaScript Promise の概要をご覧ください。
基本的な取得リクエスト
XMLHttpRequest
で実装した例を次に示します。
次に fetch
を使用します。URL をリクエストしてレスポンスを取得し、JSON として解析します。
XMLHttpRequest
XMLHttpRequest
には、成功を処理するために 2 つのリスナーが必要です。
エラーのケース、open()
と send()
の呼び出し。
MDN ドキュメントからの例
function reqListener () {
const data = JSON.parse(this.responseText);
console.log(data);
}
function reqError (err) {
console.log('Fetch Error :-S', err);
}
const oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();
フェッチ
取得リクエストは次のようになります。
fetch('./api/some.json')
.then(response => {
if (response.status !== 200) {
console.log(`Looks like there was a problem. Status Code: ${response.status}`);
return;
}
// Examine the text in the response
response.json().then(function(data) {
console.log(data);
});
})
.catch(err => {
console.log('Fetch Error :-S', err);
});
fetch()
リクエストで XHR と同じ処理を行うには、呼び出しを 1 回だけ行う必要がある
例です。レスポンスを処理するには、まずレスポンスのステータスが
JSON としてレスポンスを解析します。fetch()
リクエストに対するレスポンスは、
Stream オブジェクトです。つまり、
json()
メソッドを呼び出すと、Promise が返されます。
ストリームは非同期で行われます。
レスポンスのメタデータ
前の例では、Response オブジェクトのステータスと、レスポンスを JSON として解析する方法を示しました。ヘッダーなど、アクセスする必要がある他のメタデータを処理する方法は次のとおりです。
fetch('users.json').then(response => {
console.log(response.headers.get('Content-Type'));
console.log(response.headers.get('Date'));
console.log(response.status);
console.log(response.statusText);
console.log(response.type);
console.log(response.url);
});
レスポンス タイプ
フェッチ リクエストを行うと、レスポンスに response.type
が返されます。
/「basic
」、
「cors
」または
「opaque
」。
これら types
はリソースの出所を示しており、
レスポンスオブジェクトの扱い方が決まります
ブラウザが同じ送信元のリソースをリクエストすると、レスポンスのタイプは basic
になり、レスポンスから表示できる内容が制限されます。
別のオリジンのリソースに対してリクエストを行い、そのオリジンが
COR ヘッダーの場合、型は cors
です。cors
basic
レスポンスに似ていますが、使用するヘッダー
Cache-Control
、Content-Language
、Content-Type
、Expires
、
Last-Modified
、Pragma
です。
opaque
レスポンスは、CORS ヘッダーを返さない別のオリジンから送信されます。レスポンスが不透明の場合、
返されたデータの読み取りやリクエストのステータスの表示。
リクエストが成功したかどうか。
特定のリクエスト タイプのみが解決されるように、フェッチ リクエストのモードを定義できます。設定できるモードは次のとおりです。
same-origin
は、同じオリジンのアセットのリクエストでのみ成功し、他のすべてのリクエストを拒否します。cors
は、同じ生成元と他の生成元でのアセットのリクエストを許可します。 適切な COR ヘッダーを返す。cors-with-forced-preflight
がプリフライトを実行します。 チェック 確認する必要がありますno-cors
は、CORS ヘッダーのない他のオリジンにリクエストを行い、opaque
レスポンスを返すことを目的としていますが、前述のように、現時点ではウィンドウのグローバル スコープでこれを行うことはできません。
モードを定義するには、fetch
リクエストの 2 番目のパラメータとしてオプション オブジェクトを追加し、そのオブジェクトでモードを定義します。
fetch('http://some-site.com/cors-enabled/some.json', {mode: 'cors'})
.then(response => response.text())
.then(text => {
console.log('Request successful', text);
})
.catch(error => {
log('Request failed', error)
});
Promise チェーン
Promise の優れた機能の一つは、それらを連結できることです。fetch()
の場合、フェッチ リクエスト間でロジックを共有できます。
JSON API を使用している場合は、ステータスを確認し、 各レスポンスの JSON。ステータスと JSON 解析を Promise を返す別の関数で定義し、フェッチ リクエストを使用して最終データとエラーケースのみを処理することで、コードを簡素化できます。
function status (response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
}
function json (response) {
return response.json()
}
fetch('users.json')
.then(status)
.then(json)
.then(data => {
console.log('Request succeeded with JSON response', data);
}).catch(error => {
console.log('Request failed', error);
});
この例では、response.status
をチェックし、解決された Promise を Promise.resolve()
として、または拒否された Promise を Promise.reject()
として返す status
関数を定義します。これは fetch()
チェーンで呼び出される最初のメソッドです。
Promise が解決されると、スクリプトは json()
メソッドを呼び出します。これにより、
response.json()
呼び出しから 2 番目の Promise を返し、
解析された JSON を含むオブジェクト。解析に失敗した場合、Promise は
catch ステートメントが実行されます。
この構造により、すべての取得リクエストでロジックを共有できるため、コードのメンテナンス、読み取り、テストが容易になります。
POST リクエスト
ウェブアプリで POST メソッドを使用して API を呼び出し、リクエストの本文にパラメータを追加する必要がある場合があります。これを行うには、method
と body
を設定します。
fetch()
オプション内のパラメータ:
fetch(url, {
method: 'post',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: 'foo=bar&lorem=ipsum'
})
.then(json)
.then(data => {
console.log('Request succeeded with JSON response', data);
})
.catch(error => {
console.log('Request failed', error);
});
取得リクエストで認証情報を送信する
Cookie などの認証情報を使用して取得リクエストを行うには、リクエストの credentials
値を "include"
に設定します。
fetch(url, {
credentials: 'include'
})