Fetch API
ブラウザで動く JavaScript から HTTP リクエストを発行する
これまで、ブラウザがサーバーに対してリクエストを送信するのは、リンクがクリックされたときや、フォームが送信されたときなど、ページの再読み込みが起こる場合のみでした。
しかしながら、ブラウザ上で動く JavaScript から利用できる Fetch API を用いると、任意のタイミングでリクエストが発行できるようになります。API は、アプリケーションプログラミングインターフェース(Application Programming Interface)の略で、あるソフトウェアの機能や管理するデータを、外部の他のソフトウェアで利用するための手順やデータ形式を定めた規約のことです。多くのソフトウェアが共通して利用する機能がまとめて提供されており、API に従い短いコードを記述するだけでその機能を利用することができます。
サーバーと クライアント、どちらで動く JavaScript なのかに注意しながら、次のプログラムを実行してみましょう。
<button id="fetch-button">天気予報を見る</button>
document.getElementById("fetch-button").onclick = async () => {
const response = await fetch("/weather");
const weather = await response.text();
alert(weather);
};
async () => {}
は、非同期関数、つまり async
キーワードのついた関数を生成するためのアロー関数式です。
fetch
関数は、リクエストを発行するための関数です。標準ではGET リクエストが発行されます。この関数の戻り値に await 演算子
を適用すると、発行したリクエストに対する Response
クラスのインスタンスが得られます。fetch
関数を利用することで、ページの再読み込みを伴わず、関数が実行されるタイミングでリクエストを発行することができます。
Response#text
メソッドは、レスポンスボディ全体を文字列として読み込むための非同期関数です。
なお、サーバーでは次のプログラムが動作しているものとします。
import express from "express";
const app = express();
app.use(express.static("static"));
app.get("/weather", (request, response) => {
response.send("晴れ");
});
app.listen(3000);
POST リクエストを送信する
何もオプションをつけずに呼び出された fetch
関数は、GET リクエストを送信します。しかしながら、fetch
関数の第 2 引数に指定したオブジェクトの method
プロパティに "post"
を指定することで、POST リクエストを送信できます。
このとき、リクエストボディは、 fetch
関数の第 2 引数に指定したオブジェクトの body
プロパティに指定します。
document.getElementById("send-button").onclick = async () => {
const name = document.getElementById("name").value;
const age = document.getElementById("age").value;
const body = new URLSearchParams({ name: name, age: age });
const response = await fetch("/send", { method: "post", body: body });
const text = await response.text();
alert(text);
};
import express from "express";
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.static("static"));
app.post("/send", (request, response) => {
response.send(
`あなたの名前は ${request.body.name}で、${request.body.age}歳ですね。`,
);
});
app.listen(3000);
HTML のフォームで送ったものと同じ形式でデータを送信するには、GET リクエストと POST リクエスト節で扱ったように、リクエストボディがクエリ文字列の形式になっている必要があります。URLSearchParams
クラスを用いると、クエリ文字列を簡単に扱うことができます。この例では、リクエストボディには name=入力された名前&age=入力された年齢
といった文字列が格納されます。
リクエストボディに JSON を使用する
前項では、リクエストボディに