こんにちは、フロントエンドエンジニアのまさにょんです。
今回は、JavaScriptのFetch APIでGET/POST通信をする方法について解説します。
目次
Fetch APIとは?
Fetch API は JavaScirptの標準使用で、非同期のHTTPリクエストを送信するための APIです。
Fetch APIはブラウザに標準で実装されているので、ライブラリとして別途、installなどしなくても、そのまま使用することができます。
Fetch APIでGET通信をする
まずは1番ベーシックなGET通信を Fetch API で実行してみます。
次のSampleCodeでは、fetch関数でGETリクエストを送信し、結果(レスポンス)をJSONで取得しています。
fetch通信のResponseであるObjectに様々なデータが格納されています。
// < await 記述Pattern Ver. Get >
// 1. fetch 関数でGETリクエストを送信して、レスポンス(Promise)を変数に格納する。
const response = await fetch('https://jsonplaceholder.typicode.com/todos/');
// 2. fetch通信のResponseであるObjectに様々なデータが格納されています。
// 3.Response.ok には、レスポンスが成功したか否かを通知する論理値が入ります。
if(response.ok){
console.log("正常です");
}
// 4. Response.json()
// => レスポンスの本体のテキストを JSON として解釈した結果で解決するプロミスを返します。
const jsonData = await response.json();
console.log('response.json():', jsonData);
上記のSampleCodeをConsoleで実行すると、次のような結果になります。
response.ok
が true
なので、Fetch API の通信が成功したことと、
Response を JSONデータとして、受信していることがわかります。
Fetch APIで、thenメソッドを使用する書き方
Fetch APIで then()
によるメソッドチェーンでレスポンスを取り出す際は、注意が必要で、
fetch関数でリクエストを送信する箇所とresponse.json()
などのレスポンス本文を取得する関数で、
それぞれPromissが返ってくるので、then()
を2段階で構える必要があります。
// < then() 記述Pattern Ver. Get >
fetch('https://jsonplaceholder.typicode.com/todos/')
.then(response => response.json())
.then(json => console.log(json))
.catch(e => console.error(e.message));
Fetch APIでは、then-catch記法よりも try-catch-finally記法
外部APIとのネットワーク通信では、通信に失敗することも視野に入れて実装する必要があります。
先述のthen()
によるメソッドチェーンは、ネストが深くなりがちなのでtry-catch-finally
を使用した記法をおすすめします。
// Flag
let isLoading = false;
let confirmDialog = false;
let resultMsg = false;
// tryブロック: 処理の正常性をCheckするブロック
try {
// Loading-アニメーション
isLoading = true;
let res = await fetch('https://jsonplaceholder.typicode.com/todos/');
if (res.ok) {
// 1. 通信処理に成功した場合の対応
resultMsg = true;
let fetchData = await res.json();
console.log(fetchData);
}
// catchブロック: エラーハンドリング
} catch (error) {
console.error({ error });
// 2. 通信処理に失敗した場合は、エラーメッセージを表示する!
resultMsg = false;
// finallyブロック: 成功・失敗に関わらず、必ず実行する処理
} finally {
// 3. await完了後に、Loading処理を終了 => ダイアログを表示する
isLoading = false;
confirmDialog = true;
}
console.log({
isLoading,
resultMsg,
confirmDialog
});
// [ 出力結果 ]
// {isLoading: false, resultMsg: true, confirmDialog: true}
JavaScriptの例外処理、try-catch-finally文の使用方法については、こちらの記事にまとめています。
Response Object (Class)を活用する
Fetch API の通信結果(レスポンス)である Response Object (Class)には、様々なデータが格納されています。
MDNの説明を引用します。
Response
Response
はフェッチ API のインターフェイスで、リクエストのレスポンスを表します。
Response
オブジェクトはResponse()
コンストラクターを用いて生成することができますが、他の API 操作の結果として返される
Response
オブジェクトに出会う可能性が高いでしょう。例えば、サービスワーカーの
引用元: ResponseFetchEvent.respondWith
や、単純なfetch()
などです。
Response Object (Class)には、様々なプロパティとメソッドが用意されています。
そのプロパティやメソッドを適切に活用することが、Fetch API を使用する際で重要なポイントの1つです。
Response Object (Class)のプロパティを活用する
Response Object (Class)のプロパティの主なものをみていきます。
// < Response Object (Class)のプロパティを活用する >
// 1. fetch 関数でGETリクエストを送信して、レスポンス(Promise)を変数に格納する。
const response = await fetch('https://jsonplaceholder.typicode.com/todos/');
// 2. instanceof で Response-ClassのObjectかどうかをCheckする!
if (response instanceof Response) console.log('Response-Objectです');
console.log(' Response-プロパティ');
// 3. Response.body => 本文のコンテンツの ReadableStream です。
console.log('response.body:', response.body);
// [ 出力 ]
// response.body: ReadableStream {locked: false}
// 4. Response.headers => レスポンスに関連した Headers オブジェクトが入ります。
console.log('response.headers:', response.headers);
// [ 出力 ]
// response.headers: Headers {}
// 5. Response.ok には、レスポンスが成功したか否かを通知する論理値が入ります。
console.log('response.ok:', response.ok);
// [ 出力 ]
// response.ok: true
// 6. Response.redirected => レスポンスがリダイレクトの結果であるかどうかを示します。
console.log('response.redirected:', response.redirected);
// [ 出力 ]
// response.redirected false
// 7. Response.status => このレスポンスのステータスコードを返します。
console.log('response.status', response.status);
// [ 出力 ]
// response.status 200
// 8. Response.type => レスポンスの種類です (例えば basic, cors)
console.log('response.type:', response.type);
// [ 出力 ]
// response.type: cors
// 9. Response.url => レスポンスの URL を返します。
console.log('response.url:', response.url);
// [ 出力 ]
// response.url: https://jsonplaceholder.typicode.com/todos/
上記のSampleCodeをConsoleで実行すると、次のような結果になります。
Response Object (Class)のメソッドを活用する
Response Object (Class)のメソッドを活用することで、JSONデータで取得する以外にも、
textデータとして取得したり、バイナリーバッファーで取得したり、フォームデータとして取得したりできます。
それぞれ使い方を見ていきます。
// Fetch APIの fetch 関数でGETリクエストを送信し、結果(レスポンス)をJSONで取得する例です。
const response = await fetch('https://jsonplaceholder.typicode.com/todos/');
// 1. Response.json()
// => レスポンスの本体のテキストを JSON として解釈した結果で解決するプロミスを返します。
const jsonData = await response.json(); // JSONで取得
// 2. Response.text()
// => レスポンスの本体のテキスト表現で解決するプロミスを返します。
const textData = await response.text(); // テキストデータで取得
// 3. Response.arrayBuffer()
// => レスポンスの本体を表す ArrayBuffer で解決するプロミスを返します。
const bufferData = await response.arrayBuffer(); // バイナリデータバッファで取得
// 4. Response.formData()
// => レスポンスの本体を表す FormData で解決するプロミスを返します。
const formData = await response.formData(); // フォームデータで取得
// 5. Response.blob()
// => レスポンスの本体を表す Blob で解決するプロミスを返します。
const blobData = await response.blob(); // Blobで取得
Fetch APIでPOST通信をする
ここからは、非同期の POSTリクエストを Fetch APIで送る方法を見てみます。
fetch
関数は、指定しないとデフォルトでGET
リクエストを送信するため、
POSTリクエストを送信する場合は、引数のオプションに method: "POST"
を指定します。
フォーム(multipart/form-data)形式でPOSTする
フォーム形式の multipart/form-data でPOSTする場合は、FormDataクラスにデータを格納して送信します。
// 1. フォーム(multipart/form-data)形式でPOSTする
// 2. FormDataクラスのインスタンスを作成する
const form = new FormData();
form.append('nama', 'Robotama');
form.append('address', 'Saitama');
// 3. Post通信
const formResponse = await fetch("https://httpbin.org/post", {
method: "POST", // HTTP-Methodを指定する!
body: form // リクエストボディーにフォームデータを設定
});
console.log(await formResponse.json());
上記のSampleCodeをConsoleで実行すると、次のような結果になります。
application/x-www-form-urlencoded形式でPOSTする
URLエンコードありのフォーム形式の application/x-www-form-urlencoded でPOSTする場合は、
URLSearchParamsクラスを使います。
// 1. application/x-www-form-urlencoded形式でPOSTする
// 2. URLSearchParamsクラスのインスタンスを作成する
const params = new URLSearchParams();
params.append('id', 123);
params.append('name', 'Robotama Gunmar');
// 3. Post通信をする
const postResponse = await fetch("https://httpbin.org/post", {
method: "POST", // HTTP-Methodを指定する!
body: params, // リクエストボディーにURLSearchParamsを設定
});
console.log(await postResponse.json());
上記のSampleCodeをConsoleで実行すると、次のような結果になります。
JSON形式(application/json)でPOSTする
JSONデータを POSTする場合は、bodyに JSON.stringify()
でJSON文字列にしたデータを設定します。
また、通常のテキストデータではなくJSONデータの送信なので、
‘Content-Type’: ‘application/json’ を headers に設定します。
// 1. JSON形式(application/json)でPOSTする
// 2. 送信するParameterを準備する
const requestBody = {
msg: 'ロボ玉',
from: 'グンマー帝国'
};
// 3. Post通信をする
const postRes = await fetch("https://httpbin.org/post", {
method: "POST", // HTTP-Methodを指定する!
headers: {
'Content-Type': 'application/json' //
},
body: JSON.stringify(requestBody), // リクエストボディーにJSONデータを設定
});
console.log(await postRes.json());
上記のSampleCodeをConsoleで実行すると、次のような結果になります。
関連記事
参考・引用
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!