開発者ブログ
自習室 » Ajax通信

Ajax通信

Last modified by kashi on 2016/08/25, 15:42

Ajaxとは

Ajaxとは、Asynchronous JavaScript + XMLの略で、"エイジャックス"と読みます。非同期でJavaScriptでサーバと通信をする方法のことです。

同期と非同期

Ajaxの"A"は"Asynchronous"で、"非同期"を表します。クライアントとサーバとの通信には「同期」と「非同期」の二種類があります。

同期通信の場合、サーバにリクエストを送ってからレスポンスが返ってくるまでブラウザの操作や処理の実行ができません。

非同期通信の場合、リクエストを送った後、レスポンスが返ってくるのを待たずに操作や処理を実行できます。

Ajaxでは非同期通信も同期通信も可能です。

  • 同期通信
    sequenceSync.png
  • 非同期通信
    sequenceAsync.png

hifive、jQueryを用いたAjax通信

jQueryの場合はjQuery.ajax()( $.ajax() )、hifiveを使用している場合はh5.ajax()でAjax通信を行うことができます。どちらも基本的には同じです。h5.ajaxは内部でjQuery.ajaxを使用しています。

JSDoc: h5.ajax
jQuery.ajax() | jQuery API Documentation

ajaxメソッドは以下のように使用します

var url = '../sample.html';

// urlへ非同期でリクエストを送る。urlは絶対パスでも相対パスでもOK
h5.ajax(url);

// 設定オブジェクトを第2引数に指定
var settings = {/* 後ほど説明します */};
h5.ajax(url, settings);

// 設定オブジェクトにurlを持たせて第1引数に渡す
settings.url = url;
h5.ajax(settings);

設定オブジェクト

ajax()メソッドには設定オブジェクトを渡すことができます。

$.ajaxSettingsで設定されているものと、ajax()の引数に渡したものをマージしたものが使用されます(引数で渡したものが優先されます)。

$.ajaxSettingsはただのオブジェクトであり、編集することがでます。また、$.ajaxSetup()を使って設定をすることもできます。

// ajax()を使った全てのリクエストでキャッシュを使わない設定
$.ajaxSetup({cache:false});
// $.ajaxSettings.chace = false; と書いても同じ

// デフォルトの設定が使用されるのでキャッシュを使わないでアクセスされる
$.ajax(url);

以下、設定オブジェクトの各プロパティについての簡単な説明です。jQuery1.10.2のAPIを元に記述しています。詳細はjQuery.ajax() | jQuery API Documentation(英語)をご覧ください。

プロパティ名説明
acceptsObjectリクエストヘッダのAcceptをオブジェクトで指定します。
asyncBoolean非同期でアクセスするかどうかを指定します。デフォルトはtrueで、falseを設定した場合は同期になります
beforeSendFunctionリクエストを送る前に実行する処理を関数で指定します。
cacheBooleanキャッシュがあるときに使用するかどうかを指定します。デフォルトはtrueですが、dataTypeがscriptまたはjsonpの場合はデフォルトはfalseです
completeFunctionAjax通信が成功または失敗した時に実行する関数を指定します
contentsObjectレスポンスをどうパースするかをオブジェクトで指定します。dataTypeをキーに、正規表現を値にもつオブジェクトを指定し、レスポンスのContent-Typeが正規表現にマッチした時にjQueryがdataTypeに応じてレスポンスをパースします
contentTypeStringサーバにデータを送るときのContent-Typeを指定します。デフォルトは'application/x-www-form-urlencoded; charset=UTF-8'です
contextObjectコールバック関数内で'this'として使用するオブジェクトを指定できます
convertersObjectdataTypeに対応するレスポンスのパース方法ををオブジェクトで指定します
crossDomainBoolean同一ドメイン上でクロスドメインリクエストを強制したい場合はtrueに指定します
dataObject|Stringサーバへ送信するデータを指定します
dataFilterFunctionサーバからの返ってきた値をフィルタリングする関数を指定します
dataTypeString戻り値の型を指定します。指定しない場合はjQueryが推測します。
errorFunction失敗時に実行する関数を指定します
globalBooleanグローバルAjaxイベント('ajaxStart'や'ajaxStop')をあげるかどうかを指定します。デフォルトはtrueです。
headersObjectリクエストヘッダに追加する値をオブジェクトで指定します。
ifModifiedBoolean前回の通信から変更がある場合のみ成功ステータスを返します。デフォルトはfalseです
isLocalBooleantrueを指定すると処理をローカルのものとして扱います
jsonpStringJSONPリクエスト中のコールバック関数名を書き換えます
jsonpCallbackString|FunctionJSONPリクエストのコールバック関数名を指定します。指定しない場合はjQueryが生成するランダムな名前を使用します
mineTypeStringMINEタイプを上書きます
passwordString認証が必要なHTTP通信時にパスワードを指定します
processDataBooleandataに指定したオブジェクトをクエリ文字列に変換するかどうかを指定します。デフォルトはtrueです。
scriptCharsetStringdataTypeがjsonpもしくはscriptの時に読み込むスクリプトの文字コードを指定します
statusCodeObjectステータスコードごとに実行する関数をオブジェクトで指定します
successFunction成功時のコールバック関数を指定します
timeoutNumberタイムアウトとして扱う時間をミリ秒で設定します
traditionalBooleantrueを指定すると、パラメータを古い形式でシリアライズします
typeStringリクエストのタイプを"POST"または"GET"で指定します。デフォルトは"GET"です
urlStringクエストを送るURLを指定します。第1引数にURLを指定した場合はそちらが優先されます
usernameString認証が必要なHTTP通信時のユーザ名を指定します
xhrFunctionXMLHttpRequestObjectを生成するためのコールバック関数を指定します。デフォルトでは、IEの場合はActiveXObject、他のブラウザではXMLHttpRequestを使用します
xhrFieldsObjectXHRオブジェクトに追加で設定するキーと値をオブジェクトで設定します

非同期通信のコールバック

設定オブジェクトのsuccess、error、completeを使って登録することができます

$.ajax(url, {
    success: function(data, textStatus, jqXHR){
       // 成功時の処理
   },
    error: function(jqXHR, textStatus, errorThrown){
       // 失敗時の処理
   },
    complete: function(jqXHR, textStatus){
       // 終了時(成功、失敗)の処理
   }
});

またこの方法以外に、ajax()メソッドの戻り値を使ってコールバックを登録することもできます。

jqXHRとプロミスオブジェクト

ajax()メソッドはjqXHRオブジェクトというオブジェクトを返します。jqXHRはプロミスオブジェクトのメソッドを持ちます。

プロミスオブジェクトとは、非同期処理の状態を管理するオブジェクトです。非同期処理が終了すると、プロミスオブジェクトのメソッドを使って登録されたコールバック関数を実行します。

つまり、プロミスオブジェクトを使ってにコールバック関数を登録しておくと、そのプロミスオブジェクトに紐づいている非同期処理が終了した後に実行させることができます。

ajax()の戻り値であるjqXHRは、Ajaxを使った非同期通信処理と紐づいたプロミスオブジェクトとして振る舞い、コールバックを使ってAjax非同期通信が終了した後に実行したい処理を記述することができます。

成功時に実行したいコールバックはdone()、失敗時に実行したいコールバックはfail()、成功失敗に関わらず非同期処理が終了したら必ず実行してほしいコールバックはalways()メソッドを使ってコールバックを登録できます。

// Ajaxリクエストを送信
var promise = $.ajax(url);

promise.done(function(data, textStatus, jqXHR){
   // 成功時の処理
});
promise.fail(function(jqXHR, textStatus, errorThrown){
   // 失敗時の処理
});
promise.always(function(/* 引数は成功時はdone、失敗時はfailに登録されたコールバックと同じ */){
   // 終了時(成功、失敗)の処理
});

非同期処理の詳細については、自習室 非同期処理(未稿)をご覧ください。

hifiveでAjax通信を行う

Ajax通信は非同期で通信できるため、データが必要になったときにajaxメソッドを呼んでおき、レスポンスが返ってくるまでの間には他の処理を実行できます。レスポンスが返ってきたときに行う処理はコールバックで登録しておきます。

例えば、コントローラバインド時にサーバからデータを取得して、データを表示するようなコントローラを作成するとします。

Ajax通信の処理はコントローラではなく、ロジックに記述するのが望ましいです。Ajax通信などのデータ処理はコントローラに記述するビュー操作とは切り離しておくべきです。

ソースコードの記述例です。

(function() {
var ajaxSampleLogic = {
__name: 'sample.AjaxSampleLogic',
getData: function() {
// jqXHRオブジェクトを返す
return h5.ajax('./data');
}
};
h5.core.expose(ajaxSampleLogic);
})();
(function() {
var sampleController = {
__name: 'sample.SampleController',
__templates: 'sample.ejs',
_ajaxSampleLogic: sample.AjaxSampleLogic,
__ready: function() {
// jqXHRに対してdoneハンドラを登録
// 成功したらthis._showDataを実行する
// _showData内のthisをコントローラにしたいので、this.own()で包む
this._ajaxSampleLogic.getData().done(this.own(this._showData));
},
_showData: function(data){
// dataを表示
this.view.update(this.rootElement, 'sampleTemp', data);
}
};
h5.core.expose(sampleController);
})();

Copyright (C) 2012-2017 NS Solutions Corporation, All Rights Reserved.