JavaScriptのFetch APIでGET/POST通信をする (Fetchの使い方)

Fetch-API

こんにちは、フロントエンドエンジニアのまさにょんです。

今回は、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.oktrue なので、Fetch API の通信が成功したことと、

ResponseJSONデータとして、受信していることがわかります。

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 オブジェクトに出会う可能性が高いでしょう。

例えば、サービスワーカーの FetchEvent.respondWith や、単純な fetch() などです。

引用元: Response

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-dataPOSTする場合は、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で実行すると、次のような結果になります。

関連記事

参考・引用

  1. Fetch APIの使い方!JavaScriptでGET/POSTを非同期で送信
  2. fetch()
  3. Response

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

最近の投稿