Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

XMLHttpRequestとは?非推奨の理由やFetchとの関係などを解説

近年Fetch APIの登場に伴い、XMLHttpRequestがどんどん代替されて、ユーザーがどんどん少なくなってきています。本文では、XMLHttpRequestの基本情報を紹介した上、XHRが現在非推奨の理由と、その後継であるFetchとの比較を紹介していきたいと思います。

中村 拓也

中村 拓也

Updated on 11月 12, 2024

XMLHttpRequest(エックスエムエルHTTPリクエスト)とは、JavaScriptを使ってHTTPリクエストを送信するためのAPIです。従来からブラウザ標準のネイティブAPIとして、多くの開発者に利用されています。また、XMLHttpRequestは、その略語のXHRとして知られている場合も多くあります。ただし、近年Fetch APIの登場に伴い、XMLHttpRequestがどんどん代替されて、ユーザーがどんどん少なくなってきています。本文では、XMLHttpRequestの基本情報を紹介した上、XHRが現在非推奨の理由と、その後継であるFetchとの比較を紹介していきたいと思います。

💡
ApidogというGUIが備えるより使いやすいAPI管理ツールを使って、より簡単にHTTP通信を行ったり、APIを管理したりする方法をも一緒に紹介します。

完全無料で利用可能なツールですので、APIを効率的に管理する必要がある場合、次のボタンからこのツールを無料で利用してください。
button

XMLHttpRequest(XHR)とは

XMLHttpRequest(XHR)は、従来のブラウザ標準のネイティブAPIとして、JavaScriptを使ってHTTPリクエストを送信することができます。しかし、近年Fetch APIの登場に伴い、XMLHttpRequestが代替され、そのユーザーもどんどんFetch APIの利用に遷移しているそうです。

XMLHttpRequestの特徴

XMLHttpRequestは、従来のブラウザのネーティブAPIとして、主に次のような特徴があると思われています。

  • ブラウザとサーバー間でデータを非同期的に交換できる
  • ページの全体や部分的な更新が可能
  • ページ遷移せずにデータ通信ができる

XMLHttpRequestオブジェクトを生成し、open()メソッドでリクエストを初期化します。その後send()メソッドでリクエストをサーバーに送信します。レスポンスが返ってくるとイベントが発火し、レスポンスデータが取得できます。このXMLHttpRequestはAjax技術の基礎としてよく利用されています。ページ全体をリロードせずにデータの取得や送信が行えるため、より良いユーザーエクスペリエンスを提供できます。

前述のように、最近のブラウザではFetch APIが登場し、Promiseベースで記述できるなどよりモダンなAPIとして位置づけられていますが、将来的にはXMLHttpRequestの代替が進む流れにあると言えます。ただし既存システムへの影響などもあり、依然としてXMLHttpRequestは広く使われている技術です。

XHRの使い方:サーバーとのHTTP通信の実現方法

XMLHttpRequestを使って、HTTP通信を行うための使い方は難しくありません。次は、XHRの基本的な使い方を皆さんに紹介していこうと思います。

  1. XMLHttpRequestオブジェクトのインスタンスを生成する
var xhr = new XMLHttpRequest();
  1. openメソッドで通信の方法やURLを指定する
xhr.open('GET', 'data.json');
  1. 必要に応じてヘッダー等の追加設定を行う
xhr.responseType = 'json'; 
xhr.withCredentials = true;
  1. sendメソッドでリクエストを送信する
xhr.send(); 
  1. イベントリスナーを登録して通信完了時の処理を定義する
xhr.onload = function() {
  if(xhr.status === 200) {
    // 成功時の処理
  } else {
    // エラー時の処理
  }
}
  1. 必要に応じて通信進捗のイベントも処理する
xhr.onprogress = function(event) {
  // 通信中の処理
} 

この基本的な流れを理解し、目的に応じてイベント処理やオプションを設定していくことで、柔軟な通信を実現できます。

XHRはJSONデータにも対応可能?

APIの初心者にとって、 XMLHttpRequestはJSONベースのAPIにも対応できるかどうかという疑問を持ちやすくなりますね。なぜかというと、XMLHttpRequestという名前から、XMLフォーマットのデータのみを扱うAPIだと誤解を招きやすくなるからです。しかし、実際にXMLHttpRequestを使用すると、XHRもJSONデータの処理にも対応していることがわかるようになります。

XMLHttpRequestのsend()メソッドにJSONデータの文字列をパラメータとして渡すことで、リクエストボディにJSONデータを設定できます。

例えば以下のようなコードで実現可能です。

// JSONデータのオブジェクトを定義
var data = {
  name: "John",
  age: 30 
}

// JSON.stringifyでJSON文字列に変換
var jsonData = JSON.stringify(data);

// XMLHttpRequestのインスタンスを生成
var xhr = new XMLHttpRequest();

// POSTメソッドでexample.phpにリクエスト送信
xhr.open("POST", "example.php");

// リクエストヘッダーのContent-Typeを設定
xhr.setRequestHeader("Content-Type", "application/json");

// リクエストボディにjsonDataをセット  
xhr.send(jsonData);

このように、JavaScriptのオブジェクトをJSON.stringifyでJSON文字列に変換し、それをsend()に渡すことでJSONデータを送信できます。サーバー側の処理でこのJSONを受け取り、解析することができます。

時代遅れ?XHRが非推奨の技術になった原因

近年、Fetch APIの登場に伴って、長年ブラウザ標準のAPIであるXMLHttpRequestが非推奨になりがちです。その原因として、主に次のようになります:

コールバック地獄に陥りやすい

XMLHttpRequestは基本的にはイベント駆動でコールバック関数を使って処理を定義します。このため複雑な処理を書くとネストが深くなりコールバック地獄になりがちです。

Promiseなどのモダンな非同期処理に対応できていない

Fetch APIやAsync/AwaitなどPromiseベースの新しい非同期処理が登場していますが、XMLHttpRequestはそれらと直接は相性が良くありません。

ストリーミング送受信に対応していない

大きなデータを送受信する際、XMLHttpRequestでは一度に全てのデータをメモリに読み込む必要があります。

符号化や圧縮されたレスポンスに対応できない

Fetch APIなどでは様々なレスポンスフォーマットに対応できますが、XMLHttpRequestはそうした機能が貧弱です。

これらの制限を解決するためにFetch APIが登場しました。Promiseベースで直感的なコーディングが可能で、ストリーミングや様々なデータフォーマットにも柔軟に対応できます。ただし、ブラウザへの実装状況に依存する部分があるため、XMLHttpRequestも併用しつつ移行していくことが必要なのでしょう。

XHRとその後継であるFetch APIとの比較

FetchはXMLHttpRequestの後継として登場した新しいAPIであり、よりモダーンで優れたサーバー通信の仕組みを提供しますので、従来のXHRを代替品として利用されることが多くなっています。確かに、比較的に新しい技術として、XHRに比べて、Fetch APIの方がメリットが多くあります:

  • FetchはPromiseベースで設計されているため、非同期処理を直感的に表現できコールバック地獄が解消されます。
  • Fetchはリクエストとレスポンスを流暢に操作するストリーミング機能をサポートしています。
  • Fetchは符号化や圧縮されたレスポンスデータに関する処理が豊富です。
  • Fetchにはキャッシュコントロールやリクエストのスコープ定義などの機能が備わっています。
  • ブラウザやNode.jsの最新バージョンではFetchが本格採用されてきており、代替の動きが進んでいます。

ということで、XMLHttpRequestの後継として、より高機能なFetchがメインのAPIとなりつつあり、将来的にはXMLHttpRequestの代替が進む流れにあると言えます。ただし既存システムへの影響などもあり、当面は併用される可能性も大いにあるでしょう。

XMLHttpRequest(XHR)とFetch APIの比較表

項目 XMLHttpRequest Fetch API
概要 ブラウザでのHTTP通信を実現するためのAPI XHRの新しい代替API
プロトコル HTTP/1.1 HTTP/2
非同期処理 コールバック Promise
コーディング 複雑 シンプル
キャンセル 非対応 対応
ストリーミング 非対応 対応
リクエスト/レスポンス 区別必要 単一オブジェクト
キャッシュコントール 非対応 対応
圧縮/エンコード 非対応 対応
ヘッダー制御 複雑 シンプル
ブラウザ互換性 高い 新しいブラウザがほぼ対応

Fetch APIは Promiseベースでシンプルな非同期処理の記述が可能です。ストリーミングやHTTP/2などモダンな機能に対応していますが、ブラウザの互換性が課題になっています。XHRも併用しつつ徐々に移行が進んでいく状況です。

button

Apidog|より簡単にHTTP通信を行える

XHRとFetch APIとは別に、Apidogは非常に直感的なGUIを提供しています。ユーザーは、Apidogを使ってより簡単にHTTP通信を行うこともできますし、APIの仕様をデザインしたり、APIをテストしたりすることができるので、非常に便利にAPIを管理できるツールです。

また、汎用されているWebAPIだけではなく、ApidogはWebSocket、GraphQL、GRPC、SOAPなどのAPIにも全面的にサポートしています。また、Apidogのシナリオテスト機能を使って、テストシナリオを作成して、業務にピッタリするAPIのワークフローを自動的にテストすることもできるので、非常に便利なツールになります。

ApidogでAPIをテスト
button

ApidogでXHRとFetchの実装コードをも簡単に生成

また、Apidogにはコード生成機能が含まれています。このコード生成機能を使って、FetchやXHRなどのAPIリクエストライブラリの実装コードを生成できるだけではなく、Express、Springなどのサーバーサイドのコードをも即座に生成できるので、API開発の効率を非常に上げることができます。

ApidogでFetchやXHRの実装コードを生成するには、次の手順を参照してください。Apidogを使ってAPIをテストして、問題がないことを確認した上、コード生成で当該APIを直接に本番環境に入れたりするのがApidogがおすすめしたベストプラクティスになります。

ステップ⒈Apidogで実装したいAPIをクリックして、右側パネルで「コード生成」にガーソルを置き、「クライアントコードを生成」を選択します。

Apidogクライアントコードの生成

ステップ⒉コード生成ウィンドウで、「JavaScript」を選択すると、右側パネルで「Fetch」か「XHR」を選択することもできます。そこを選択すると、それぞれの実装コードがすぐに下に表示されます。

FetchとXHRの実装コードを生成

そうすると、FetchやXHRの実装コードを簡単に手に入れることができるので、この実装コードをコピペしたら、それぞれを簡単に実行することができるので、非常に便利です。

button

まとめ

この記事は、XMLHttpRequest(XHR)の役割と特徴、 Fetch APIとの比較などを解説しました。XHRはJavaScriptからHTTP通信を実現するために古くから利用されてきたWeb標準のAPIです。Ajax技術の基盤として、動的なウェブアプリケーション構築を支えてきました。一方で、コールバックによる複雑な非同期処理の記述や、大量データへの対応など、機能面での限界も指摘されてきました。そこで後継のFetch APIが登場し、Promiseベースの処理やデータストリーミングといったよりモダンな機能を提供しています。ただし、Fetch APIはまだブラウザへの実装状況が不十分な部分があるため、XHRも併用しつつ移行が進められているのが現状です。

それに加えて、APIテストツールのApidogについても特徴を紹介しました。Apidogは、直感的なGUIでHTTP通信のテストが行えるツールです。WebSocketやGraphQLなど、様々なAPI仕様のテストに対応している点も大きなメリットです。また、テストしたAPIのソースコードを自動生成する機能が備わっているのが特徴的です。XHRやFetchをはじめ、サーバーサイドの実装コードも出力できます。このコード自動生成機能は、開発効率の大幅な向上が期待できる重要な機能といえます。テスト済みのコードをそのまま利用できるため、開発期間の短縮や品質の向上に繋がっていると言えるのでしょう。

初心者必読!ApidogでのPOSTリクエスト作成法効果的な戦略

初心者必読!ApidogでのPOSTリクエスト作成法

Apidogを使用してPOSTリクエストを作成するプロセスは簡単で、API開発とテストを合理化する幅広い機能を提供します。初心者から経験豊富な開発者まで、Apidogは強力なツールとして役立ちます。

中村 拓也

10月 21, 2024

手動テスト完全解説:品質を保証する最後の砦効果的な戦略

手動テスト完全解説:品質を保証する最後の砦

手動テストはソフトウェアテストライフサイクルに欠かせない要素であり、アプリケーションの品質、使いやすさ、機能を保証します。自動化の利点がある一方で、手動テストは機械では得られない貴重な洞察と創造性を提供し、包括的なテスト戦略として重要です。

中村 拓也

10月 18, 2024

PostmanでHTTP 405 メソッドなしエラーを修正する方法効果的な戦略

PostmanでHTTP 405 メソッドなしエラーを修正する方法

HTTP 405エラーコードは、無効なAPIキーまたはアクセストークンを使用してサーバーにアクセスしようとすると発生します。この記事では、405エラーについて学び、それを修正する方法について、段階的に解説します。

中村 拓也

8月 11, 2024