XMLHttpRequest 非同期通信と同期通信の使い方

XMLHttpRequest 同期通信と非同期通信 Java Script
スポンサーリンク

今回は、AJAXの通信を行う際に使われるオブジェクト、「XMLHttpRequest」について見ていきます。

AJAXとは、「Asynchronous Javascript And Xml」という造語の略で、非同期通信をJavaScriptの技術で行うことを言います。

AJAXについてはネットに詳しい記事が多数ありますので、ぜひ色々と検索してみてください。

スポンサーリンク

XMLHttpRequest

XMLHttpRequestを使用するには、以下のプロパティとメソッドを使用します。

プロパティ

プロパティ
(XMLHttpRequest +)
意味
.onreadystatechangereadyState 属性が変化する度に呼び出される
.readyStateリクエストの状態を返す
.responseサーバーから受信するデータ
.responseTypeサーバーから受信するデータの型を定義
.responseTextサーバーから受信したデータをテキスト形式で返す
.responseXMLXML、HTML形式で返す
.responseURLレスポンスがあるURL
.statusステータスを返す
.statusTextレスポンス文字列を返す
.timeoutリクエストを自動的に終了するための時間。
ミリ秒単位で指定
.ontimeoutリクエストがタイムアウトするたびに呼び出されます。

これ以外にもプロパティは複数あります。

メソッド

メソッド
(XMLHttpRequest +)
意味
.abort()リクエスを中止します。
.getAllResponseHeaders()レスポンスヘッダーを文字列として返す
.getResponseHeader()指定子たレスポンスヘッダーを
文字列として返す
open()リクエストを初期化する
send()リクエストを送信する
.setRequestHeader()リクエストヘッダーの値を設定する
.overrideMimeType()レスポンスのMIMEタイプを上書きする

非同期通信

データの処理

let xml = new XMLHttpRequest();
xml.open('GET','https://hitoridemanabou.net/data.txt',true);

openメソッドは以下の構文を取ります。

open(method,URL,[async,user,password]);

  • method:主に「GET」か「POST」
  • URL:URLを文字列で指定
  • async:trueは非同期通信、falseは同期通信(trueは省略可能)
  • user:必要に応じて
  • password:必要に応じて

GETは指定したURLでデータを取り込みます。

POSTは、指定したURLに何らかの処理を送信します。

クライアントの状態を確認するために、「.readyState」プロパティを使用します。

let xml = new XMLHttpRequest();
xml.open('GET','https://hitoridemanabou.net/data.txt',true);

console.log(xml.readyState);
 1

ここでは「1」が返されました。

クライアントの状態を表す値には以下のものがあります。

状態意味
0UNSENTクライアントは作成済み、open()は呼ばれていない
1OPENEDopen()は呼び出し済み
2HEADERS_RECEIVEDsend()は呼び出し済み
3LOADINGダウンロード中
4DONE完了

readyStateプロパティが変更された時に、値を確認するプロパティが、「onreadystatechange」プロパティになります。

onreadystatechange」プロパティはコールバック関数を伴います。

また非同期通信の時だけ使用することが出来ます。

let xml = new XMLHttpRequest();
xml.onreadystatechange = function(){
    console.log(xml.readyState);
}

xml.open('GET','https://hitoridemanabou.net/data.txt',true);
1

サーバーとの通信が正常に行われたかどうかを確認するために、「status」プロパティを使用します。

statusプロパティには、HTTPレスポンスステータスコードが格納されています。

(詳しいステータスコードについては、MDNのページでご確認ください。)

正常に通信が行われた場合は、「200」が返されます。

受信したデータを取り出すのに、ここでは「responseText」プロパティを使用します。

let xml = new XMLHttpRequest();
xml.onreadystatechange = function(){
    if(xml.readyState == 4){
        if(xml.status == 200){
            let data = xml.responseText;
            console.log(data);
        }
    }
}
xml.open('GET','https://hitoridemanabou.net/data.txt',true);

受信データの処理についてとりあえず完成しました。

サーバーに送信

サーバーにリクエストを送信するのに、「send」メソッドを使用します。

GETメソッドを使用する時は、サーバーにデータは送信しないので、「null」を指定します。

xml.send(null);

コンソールに出力する

今までの内容を踏まえて、コンソールに出力してみましょう。

最初に、「.txt」ファイルをサーバーのルートディレクトリにアップロードしておきます。

何か適当な文字を入力しておいてください。

let xml = new XMLHttpRequest();
xml.onreadystatechange = function(){
    if(xml.readyState === 4){
        if(xml.status === 200){
            let data = xml.responseText;
            console.log(data);
        }
    }
}
xml.open('GET','https://hitoridemanabou.net/sampledata.txt',true);
xml.send(null);

 Hello World!!
This is sample.

実際に当サイトで実行して頂ければテキストが表示されます。

同期通信

同期通信を行うには、open()メソッドのtrueをfalseに変更する必要があります。

let xml = new XMLHttpRequest();
xml.open('GET', 'https://hitoridemanabou.net/sampledata.txt', false);
xml.send(null);

if(xml.status === 200){
    let data = xml.responseText;
    console.log(data);
}
 Hello World!!
This is sample.

なお、同期通信は処理が止まってしまうために、非推奨になっていますし、実際に使用されることもほとんどありません。

あとがき

今回ご紹介した内容は、こちらの記事を参考に記述させて頂いております。

より詳しい内容は、「XMLHttpRequestオブジェクトを使った非同期通信を行う」をご参照ください。

今回も最後までお読み頂きありがとうございました。

タイトルとURLをコピーしました