見出し画像

XMLHttpRequest(XHR)ってなに?

こんにちは。安全確保支援士の勉強をしているカーシュン。です。
youtubeはこちら。

毎日読むだけで知った気になれるIT日記、第9回はXMLHttpRequest(XHR)について。

これは今勉強している安全確保支援士の範囲でも出てくるもので、私がよくわからなかったのでたくさんAI先生にお聞きしました。

かなり技術的にコアな話になっているので完全に理解したい方はしっかり読んで頂いて、XHR聞いたことあるなって方はこんなのもあるんだ〜と読み流していただければ。

私もまだ雑魚雑魚エンジニアなので全部は理解できないですが、あんまりしらなかったXHRの構造が結構わかるようになりました。



Q. XMLHttpRequest(XHR)ってなに?

A. XMLHttpRequest(XHR)は、ウェブブラウザやその他のクライアントサイドプラットフォームで使用されるオブジェクトであり、サーバーとの非同期通信を行うためのものです。

この技術は、ウェブページがサーバーから新しいデータを取得することができるため、ページ全体を再読み込みすることなく部分的に更新することができます。これにより、ユーザーエクスペリエンスが向上し、ウェブアプリケーションがより反応的になります。

概要

XMLHttpRequestは、その名前が示すように、もともとはXMLデータの取得のために設計されましたが、現在ではテキスト、JSON、XMLなど、さまざまなデータ形式の取得に使用されています。XHRは、JavaScriptを使用してウェブページから直接呼び出すことができるAPIを提供します。

周辺知識

  1. 非同期通信: 通常、プログラムは上から下へと順番に実行されます。しかし、非同期通信を使用すると、特定のタスクが完了するのを待たずに次のタスクに移ることができます。XHRはこの非同期通信の一例です。

  2. AJAX (Asynchronous JavaScript and XML): AJAXは、JavaScriptを使用して非同期にサーバーとデータを交換する技術のことを指します。XMLHttpRequestは、AJAXを実現するための主要なツールの一つです。

  3. JSON (JavaScript Object Notation): JSONは、データ交換のための軽量なテキストベースのフォーマットです。XMLHttpRequestは、JSONデータの取得や送信にも使用されます。

私達の生活との関わり

ウェブブラウジングの経験を持つほとんどの人々は、XMLHttpRequestの恩恵を受けています。例えば、ソーシャルメディアのフィードをスクロールしているとき、新しい投稿が自動的にロードされるのは、XHRのおかげです。また、オンラインショッピングサイトで商品をカートに追加したときに、ページ全体をリロードすることなくカートが更新されるのも、XHRのおかげです。

使用例

以下は、XMLHttpRequestを使用して非同期にサーバーからデータを取得する基本的な例です。

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.status == 200) {
    var data = JSON.parse(xhr.responseText);
    console.log(data);
  }
};
xhr.send();

このコードは、`https://api.example.com/data`からデータを非同期に取得し、コンソールに出力します。

歴史的背景

XMLHttpRequestは、2000年頃にMicrosoftがInternet Explorer 5で導入したものです。当初はActiveXオブジェクトとして提供されていました。その後、Mozilla、Safari、Operaなどの他のブラウザもこの技術を採用し、W3Cによって標準化されました。

XMLHttpRequestの導入により、ウェブページはサーバーとの間でデータを非同期に交換することができるようになり、これがAJAX(Asynchronous JavaScript and XML)という技術の基盤となりました。AJAXの登場により、Google MapsやGmailなどの革新的なウェブアプリケーションが登場し、ウェブの可能性が大きく広がりました。

このように、XMLHttpRequestは、我々のオンラインでの日常生活の中でスムーズでシームレスなユーザーエクスペリエンスを提供するための不可欠なツールとなっています。

Q. XHRの構成要素、仕組み、データの流れを詳しく教えて

A. XHRの仕組みについて、実際のデータの流れを仮想具体例を用いて詳しく説明します。

仮想具体例

シナリオ: Aliceは、ウェブ上の書店のサイトで、特定の本の詳細情報を取得したいと思っています。彼女が本のタイトルをクリックすると、XHRを使用してその本の詳細情報が非同期に取得され、ページに表示されます。

XHRの主な構成要素

1. XMLHttpRequestオブジェクト

詳細: XMLHttpRequestオブジェクトは、ブラウザが提供するAPIの一部であり、JavaScriptからHTTPリクエストを作成し、送信するためのメソッドとプロパティを持っています。このオブジェクトを使用することで、ページをリロードすることなくサーバーとの通信が可能になります。

具体例の関連: Aliceが本のタイトルをクリックしたとき、新しいXMLHttpRequestオブジェクトが作成されます。このオブジェクトを通じて、サーバーにリクエストが送信され、レスポンスが受け取られます。

2. HTTPメソッド

詳細: HTTPメソッドは、リクエストの種類を指定するためのものです。GETはデータの取得、POSTはデータの送信、PUTはデータの更新、DELETEはデータの削除など、それぞれのメソッドが特定の操作を示します。

具体例の関連: Aliceが本の詳細情報を取得したい場合、GETメソッドを使用してリクエストが作成されます。このリクエストは、指定されたURLに対してデータの取得を要求するものとなります。

3. HTTPヘッダー

詳細: HTTPヘッダーは、リクエストやレスポンスのメタデータを伝える情報です。例えば、`Content-Type`ヘッダーはデータの形式(テキスト、JSON、XMLなど)を示し、`Authorization`ヘッダーは認証情報を伝えるために使用されます。

具体例の関連: サーバーがJSON形式のレスポンスを返す場合、レスポンスヘッダーに`Content-Type: application/json`が含まれます。これにより、ブラウザはレスポンスデータがJSON形式であることを知ることができます。

4. 非同期フラグ

詳細: 非同期フラグは、リクエストが非同期であるか同期であるかを指定するものです。非同期リクエストの場合、リクエストがバックグラウンドで実行され、ページの他の操作がブロックされることはありません。同期リクエストの場合、リクエストが完了するまでページの操作がブロックされます。

具体例の関連: Aliceが本の詳細情報を取得するリクエストは非同期で行われるため、リクエストが完了するまでの間も、彼女はページの他の部分を自由に操作することができます。

5. コールバック関数

詳細: コールバック関数は、リクエストの状態変化(例: リクエストの送信、レスポンスの受信など)に応じて実行される関数です。これにより、レスポンスが受け取られたときやエラーが発生したときなど、特定のタイミングで特定の処理を行うことができます。

具体例の関連: Aliceが本の詳細情報を取得するリクエストのレスポンスが受け取られたとき、コールバック関数が実行され、この関数内でレスポンスデータが解析され、ページに本の詳細情報が表示されます。

6. HTTPステータスコード

詳細: HTTPステータスコードは、レスポンスの状態を示すコードです。200は成功を示すコードであり、404はリソースが見つからないことを示すコードです。これらのコードを使用して、リクエストが成功したのか、エラーが発生したのかなど、レスポンスの状態を判断することができます。

具体例の関連: サーバーからのレスポンスに含まれるステータスコードが200の場合、リクエストは成功したと判断され、本の詳細情報がページに表示されます。ステータスコードが404の場合、指定された本の情報が見つからないと判断され、エラーメッセージが表示されます。

7. レスポンスデータ

詳細: レスポンスデータは、サーバーから返されるデータです。このデータはテキスト、XML、JSONなどの形式であり、リクエストに応じて適切なデータが返されます。

具体例の関連: Aliceが本の詳細情報を取得するリクエストを送信した場合、サーバーはこの本の詳細情報をJSON形式でレスポンスとして返します。このレスポンスデータは、ブラウザで解析され、ページに本の詳細情報として表示されます。

データの流れの詳細

1.リクエストの初期化

  • 詳細: Aliceがウェブページ上で本のタイトルをクリックすると、JavaScriptの関数がトリガーされます。この関数内で、新しいXMLHttpRequestオブジェクトが生成され、これを使用してサーバーへのリクエストが作成されます。

var xhr = new XMLHttpRequest();

2.リクエストの設定

  • 詳細: `open`メソッドを使用して、リクエストの種類(HTTPメソッド)と目的地(URL)を設定します。

xhr.setRequestHeader('Authorization', 'Bearer YOUR_AUTH_TOKEN');

3.HTTPヘッダーの設定

  • 詳細: 必要に応じて、リクエストにHTTPヘッダーを追加します。例えば、特定の認証トークンをヘッダーに含めることで、認証が必要なAPIにアクセスすることができます。

xhr.setRequestHeader('Authorization', 'Bearer YOUR_AUTH_TOKEN');

4.リクエストの送信

  • 詳細: `send`メソッドを使用して、リクエストをサーバーに送信します。

xhr.send();

5.サーバーの処理

  • 詳細: サーバーは、リクエストを受け取り、データベースや他のリソースから必要な情報を取得します。次に、この情報をJSON形式などの適切な形式でレスポンスとして返します。

6.レスポンスの待機と受信

  • 詳細: ブラウザはサーバーからのレスポンスを受け取り、`onreadystatechange`イベントリスナーがトリガーされ、設定されているコールバック関数が実行されます。

xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
       var bookDetails = JSON.parse(xhr.responseText);
       displayBookDetails(bookDetails);
    }
};

7.レスポンスの処理

  • 詳細: コールバック関数内で、レスポンスのステータスコードを確認し、レスポンスデータを解析してページに表示します。

  1. データの表示

    • 詳細: 解析されたデータを使用して、ウェブページ上に本の詳細情報を表示する関数を呼び出します。

function displayBookDetails(data) {
    var titleElement = document.getElementById('book-title');
    var authorElement = document.getElementById('book-author');
    titleElement.textContent = data.title;
    authorElement.textContent = data.author;
}

このデータの流れを通じて、XHRの各技術的要素がどのように連携して動作するのかが明らかになりました。XHRは、これらの要素が組み合わさって、ウェブページとサーバー間の効率的なデータのやり取りを実現しています。

Q. XHRのセキュリティリスクとベストプラクティスはどんなもの?

A. XHRを使用する上でのセキュリティリスクとベストプラクティスについて、説明を行います。

ここから先は

7,969字

¥ 100

よろしければサポートお願いします!励みになります!