【JavaScript入門】XMLHttpRequestで通信をする

 XMLHttpRequest(XHR) は Fetch API 以前から存在するクラシックな通信インターフェースです。イベントとコールバックで制御するためコードが長くなりがちですが、古いブラウザやレガシーなライブラリとの互換性を保つ場面では今でも使われています。ここでは「最小の GET リクエスト」を題材に、API の要点と実装例を整理します。

1.ローカルサーバーの起動手順

1.1. Node.js のインストール

 01章のイントロダクション「10 開発環境の準備:Node.jsのインストール」の Node.js の環境準備ができているという前提で話を進めます。Node.js の環境準備ができていない場合は、以下のリンク先をご確認ください。

【JavaScript入門】開発環境の準備:Node.jsのインストール

このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。 【JavaScript入門】開発環境の準備:Node.jsのインストール 開発環境の準備:Node.js…

1.2. index.js の作成

以下の index.js を作成して、例えば「C:\Users\<ユーザー名>\Desktop\node-js\app2」に保存します。

ファイル名: index.js

// index.js
const express = require("express");
const app = express();

// ルート
app.get("/", (_, res) => res.send("Hello World"));

// 静的ファイル(/net, /web-worker 配下)
[
  { path: "/net",         root: __dirname + "/net" },
  { path: "/web-worker",  root: __dirname + "/web-worker" }
].forEach(opt => app.use(opt.path, express.static(opt.root)));

app.listen(3000, () => console.log("Server started: http://localhost:3000/"));

1.3. PowerShell を起動し、index.js を置いたフォルダへ移動します。

移動例:

PS C:\Users\joeac\Desktop\node-js\app2>

1.4. ターミナルで node . を実行

node .

1.5. ブラウザのURLに「http://localhost:3000/ 」を入力

すると 「Hello World」が表示されます。

2.XHR 基本フロー

手順コード例意味
① インスタンス生成const req = new XMLHttpRequest();通信オブジェクトを作る
② ハンドラ登録req.addEventListener('load', e => { ... });完了時(成功・失敗どちらでも)に呼ばれる
③ リクエスト設定req.open('GET', url);HTTP メソッドと URL を指定
④ 送信req.send();通信スタート

代表的プロパティ

プロパティ内容
status200, 404 などの HTTP ステータス
statusTextOKNot Found など
responseURL実際にアクセスした URL
response / responseText生データ(型は responseType 設定で変化)

3.サンプルファイル構成

app2/
├─ net/
│  ├─ data.json
│  └─ xml-http-demo.html
└─ index.js   ← Express サーバー("Fetch APIで通信をする"で使用したものと同じ)

ファイル名: data.json

{ "menu": ["ホットコーヒー", "アイスコーヒー"] }

4.xml-http-demo.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <title>📡 XMLHttpRequest デモ</title>
  <style>
    body{font-family:"Segoe UI",sans-serif;background:#f8fcff;margin:2rem}
    h1{text-align:center;font-size:1.8rem;margin-bottom:1rem}
    button{padding:.6rem 1.2rem;border:none;border-radius:6px;
           background:#0078d4;color:#fff;font-weight:bold;cursor:pointer}
    button:hover{opacity:.85}
    #log{white-space:pre-wrap;background:#fff;border:1px solid #ccc;
         border-radius:8px;margin-top:1rem;padding:1rem;min-height:6rem}
  </style>
</head>
<body>
  <h1>📡 XMLHttpRequest デモ</h1>
  <button id="loadBtn">JSON を取得</button>
  <div id="log">ここに結果が表示されます</div>

  <script>
  const log = txt => document.getElementById("log").textContent += txt + "\n";

  document.getElementById("loadBtn").onclick = () => {
    document.getElementById("log").textContent = "";     // ログクリア
    const url = "./data.json";                           // 相対パス

    const req = new XMLHttpRequest();                    // ➀
    req.addEventListener("load", function(){             // ➁ (this === req)
      log("--- this ---");
      log(this.status);
      log(this.statusText);
      log(this.responseURL);
      log(this.responseText);

      log("--- req ---");
      log(req.status);
      log(req.statusText);
      log(req.responseURL);
      log(req.responseText);
    });

    req.open("GET", url);   // ➂
    req.send();             // ➃
  };
  </script>
</body>
</html>

ブラウザの出力例

ブラウザのURLに「http://localhost:3000/ net/xml-http-demo.html」と入力します。

5.プログラム解説

  1. インスタンス生成 — new XMLHttpRequest() は毎回新しく作成する。
  2. load イベント — HTTP 200 でも 404 でも発火するため、status 判定が必要。
  3. open() — async 引数(第3引数)を省略すると既定で true(非同期)。
  4. send() — POST の場合は send(body) でデータを渡す。
  5. thisreq — イベント内の this は送信したインスタンスを指すので、同じ値が得られる。

まとめ

XMLHttpRequest は イベント駆動 + 状態管理 が必須で、Fetch API より冗長ですが、

  • 旧ブラウザ互換(IE11 など)
  • プログレスイベント(progress)によるアップロード/ダウンロード監視
    といった用途で役立ちます。まずは GET リクエストを動かし、readyState 監視や POSTFormData 送信へ発展させてみてください。