jQueryを使わないAjax、Fetch APIの書き方

Fetch APIでAjax

脱jQueryの勢いが増しております。

ちょっと前まで「まだjQuery使ってないの!?おっくれてるぅ〜」とか言っていた女子高生も、今では「エーッ!?まだjQueryなんか使ってるの?ダッサ〜い」と言っているとかいないとか。jQueryは何も悪くないんだけどね。とても優秀なライブラリです(フォロー)。

というわけで、jQueryを使わずにJavaScriptのFetch APIAjaxする方法を解説します。

目次

GETメソッドを使う

まずはできるだけシンプルに書いてみます。

TEXTデータを取得

GETメソッドでTEXTデータを取得する場合は次のように記述します。

//(1)イベントを発動させる
window.addEventListener('load', function () {
  //(2)fetch()メソッドの実行
  fetch('./data.txt')
    //(3)レスポンスの受け取り
    .then(function (response) {
      //受け取ったデータを返す
      return response.text();
    })
    //(4)受け取ったデータをコンソールに表示
    .then(function (data) {
      console.log(data);
    });
});

(1)イベントを発動させる

ページの読み込みが完了したらこの中のコードを実行しますよという記述です。

本題から逸れるのでやりませんが、ここの記述を変えれば「ボタンが押されたときに」とか「フィールドの内容が変更されたときに」コードを実行することができます。

(2)fetch()メソッドの実行

fetch() メソッドは1つまたは2つの引数を取ります。1つめの引数はURLです。ここでは ./data.txt となっています。絶対URLで指定することもできます。2つめの引数は省略可能で、省略した場合はGETメソッドでリクエストが送信されます。

(3)レスポンスの受け取り

.then() メソッドは前の処理が完了したら次にこれをしますよというものです。このようにドット . でメソッドをつなげていくことをメソッドチェーンといいます。

fetch() メソッドはPromiseオブジェクトを返します。Promiseは非同期処理の結果をあらわすオブジェクトで、この中に処理の成否や返されたデータが入っています。ここではこのPromiseを受け取る処理をします。

function (response) { ... } は無名関数です。受け取ったPromiseオブジェクトを response に入れています。

return response.text();responsetext プロパティを返します。response.text にはお目当てのTEXTデータが入っています。

(4)受け取ったデータをコンソールに表示

また .then() でつないで次の処理をします。

function (data) { ... } で返されたデータを data に入れて、console.log(data); でそれをコンソールに出力します。./data.txt の内容がコンソールに出力されることでしょう。ブラボー!

実際の運用ではここで何らかの処理をしてページの表示を変える等します。

JSONデータを取得

GETメソッドでJSONデータを取得する場合は次のように記述します。

//イベントを発動させる
window.addEventListener('load', function () {
  //fetch()メソッドの実行
  fetch('./data.json')
    //レスポンスの受け取り
    .then(function (response) {
      //受け取ったデータを返す
      return response.json();
    })
    //受け取ったデータをコンソールに表示
    .then(function (data) {
      console.log(data);
    });
});

TEXTデータを取得する場合と違うのは8行目の return response.json(); です。返されるデータがJSONの場合は json プロパティを参照します。

Promiseが返すデータの形式は次のとおりで、同じ名前のプロパティで参照することができます。

  • ArrayBuffer
  • Blob
  • FormData
  • JSON
  • TEXT

エラー処理

非同期通信が失敗した場合の処理を追加します。

//イベントを発動させる
window.addEventListener('load', function () {
  //fetch()メソッドの実行
  fetch('./data.json')
    //レスポンスの受け取り
    .then(function (response) {
      //(1)エラー処理
      if (!response.ok) {
        throw new Error(`${response.status} ${response.statusText}`);
      }
      //受け取ったデータを返す
      return response.json();
    })
    //受け取ったデータをコンソールに表示
    .then(function (data) {
      console.log(data);
    })
    //(2)エラーが発生した場合はコンソールに表示
    .catch(function (error) {
      console.error(error);
    });
});

(1)エラー処理

response.okfetch() が成功した時は true 、失敗した時は false を返します。

失敗した場合に、throw new Error()例外を発生させることによって、現在実行中の関数は停止し、catch に制御が移ります。

response.status にはHTTPステータスコード、response.statusText にはHTTPステータスを表す文字列が入っているので、それらをエラーメッセージに付加しています。オシャレにテンプレートリテラル(`...`)を使ってみました。

(2)エラーが発生した場合はコンソールに表示

上記のエラーメッセージをコンソールに表示する処理です。

通信の成否に関わらず実行する処理

finally() メソッドで、通信が成功しても失敗しても必ず実行する処理を記述することができます。

//イベントを発動させる
window.addEventListener('load', function () {
  //fetch()メソッドの実行
  fetch('./data.json')
    //レスポンスの受け取り
    .then(function (response) {
      //エラー処理
      if (!response.ok) {
        throw new Error(`エラー ${response.status} ${response.statusText}`);
      }
      //受け取ったデータを返す
      return response.json();
    })
    //受け取ったデータをコンソールに表示
    .then(function (data) {
      console.log(data);
    })
    //エラーが発生した場合はコンソールに表示
    .catch(function (error) {
      console.error(error);
    })
    //最後に必ず実行する処理
    .finally(function () {
      console.log('処理が完了しました');
    });
});

POSTメソッドを使う

POSTメソッドを使ってデータを外部プログラムに送り、戻り値を受け取る方法です。

JSON形式のデータを送信

POSTメソッドでJSONデータを送信する場合は次のように記述します。

//イベントを発動させる
window.addEventListener('load', function () {
  //送信するデータ
  const jsondata = JSON.stringify({
    name: 'コンバトラーV',
    height: '57メートル',
    weight: '550トン',
  });
  //(1)fetch()に渡す第1引数
  const url = './code.php';
  //(2)fetch()に渡す第2引数
  const options = {
    method: 'POST',
    body: jsondata,
  };
  //(3)fetch()メソッドの実行
  fetch(url, options)
    //レスポンスの受け取り
    .then(function (response) {
      //受け取ったデータを返す
      return response.json();
    })
    //受け取ったデータをコンソールに表示
    .then(function (data) {
      console.log(data);
    });
});

(1)fetch()に渡す第1引数

POSTメソッドを使う時は fetch() に渡す引数が2つあるので、見やすくするためにそれぞれを定数として定義しました。

第1引数は通信相手のURLです。絶対URL、相対URLどちらでもOKです。ここでは ./code.php というPHPスクリプトを指定しました。

(2)fetch()に渡す第2引数

POSTメソッドを使う時は fetch() のオプションを第2引数で渡す必要があります。ここでは下記の2つのオプションを指定しています。

methodGET, POST などのHTTPリクエストメソッドを指定します。指定しない場合の初期値は GET です。
body送信するデータを指定します。

他にも指定できるオプションがあります。下記で確認してください。

(3)fetch()メソッドの実行

先ほど定義した urloptions を渡して fetch() を実行します。

以下、レスポンスの受け取り等はGETの場合と同じです。

code.php の内容

<?php

//データを受け取る
$json = file_get_contents('php://input');
//JSONデータを連想配列に変換
$array = json_decode($json, true);

//ここで何か処理をする

//JSONに変換して出力
echo json_encode($array);

code.php が受け取るデータはPOSTメソッドで送信されていますが $_POST では受け取れません。なぜなら $_POST で受け取れるのは Content-Typeapplication/x-www-form-urlencoded または multipart/form-data の場合のみだからです。ちゃんとマニュアルに書いてありますね。

なので file_get_contents('php://input') で受け取ります。あとはご自由に料理してJSONで返しましょう。

FormDataオブジェクトを送信

フォームに入力されたデータをまるっと送信する方法です。

<!-- (1)HTMLフォーム -->
<form id="form1">
  <input type="text" name="field1" />
  <input type="text" name="field2" />
  <button id="fire">送信</button>
</form>

<script>
  //(2)イベントを発動させる
  const btn = document.getElementById('fire');
  btn.addEventListener('click', function (event) {
    //(3)フォームの送信をキャンセルする
    event.preventDefault();
    //(4)送信するデータ
    const form = new FormData(document.getElementById('form1'));
    //fetch()に渡す第1引数
    const url = './code.php';
    //fetch()に渡す第2引数
    const options = {
      method: 'POST',
      body: form,
    };
    //fetch()メソッドの実行
    fetch(url, options)
      //レスポンスの受け取り
      .then(function (response) {
        //受け取ったデータを返す
        return response.json();
      })
      //受け取ったデータをコンソールに表示
      .then(function (data) {
        console.log(data);
      });
  });
</script>

(1)HTMLフォーム

HTMLのフォームでは、<form><button>id を設定しておきます。

(2)イベントを発動させる

これまではページが読み込まれたときにイベントを発動していましたが、今回はid="fire"のボタンがクリックされたときにイベントを発動します。

(3)フォームの送信をキャンセルする

通常はフォームのボタンが押されるとデータが送信され画面が遷移します。そうなると、JavaScriptの実行結果が表示されなくなってしまうので、preventDefault()メソッドでフォームの送信をキャンセルします。

(4)送信するデータ

FormData()コンストラクタにフォームの要素を渡すと、そのフォーム内にある各要素のキーと値をペアとしたオブジェクトを作成することができます。

code.php の内容

<?php

//データを受け取る
$data = $_POST;

//ここで何か処理をする

//JSONに変換して出力
echo json_encode($data);

FormDataオブジェクトを送信する時はContent-Type: multipart/form-dataなので、PHP側では$_POSTでデータを受け取ることができます。

でわでわ

Fetch APIでAjax

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメント一覧 (1件)

コメントする

目次