非同期処理(AJAX)について
AJAX(Asynchronous JavaScript and XML)は、ページ全体を再読み込みせずにサーバーとデータをやり取りするための技術です。$.ajax
はその中でも柔軟性が高い方法として、広く使われています。
$.ajax
の基本形
以下は$.ajax
の基本的な構成です。
$.ajax({
url: "リクエストを送るURL",
method: "HTTPメソッド(GET, POSTなど)",
data: { key: "value" }, // サーバーに送るデータ
headers: { "X-CSRF-TOKEN": "トークン値" }, // 必要に応じてヘッダーを指定
success: function (response) {
// リクエストが成功した場合の処理
console.log("成功:", response);
},
error: function (xhr, status, error) {
// リクエストが失敗した場合の処理
console.error("エラー:", error);
alert("通信エラーが発生しました");
},
complete: function () {
// 成功・失敗に関係なく、リクエスト完了後に実行される処理
console.log("リクエストが完了しました");
},
});
各コールバックの役割
1. success
- リクエストが正常に完了し、サーバーからHTTPステータス200系のレスポンスが返ってきた場合に実行されます。
- サーバーからのデータ(
response
)を受け取ることができます。
2. error
- リクエストが失敗した場合に実行されます(HTTPステータス400系や500系、通信エラーなど)。
- 失敗時のステータスコードやエラーメッセージを取得可能です。
3. complete
- リクエストの成否に関係なく、リクエストが完了した後に必ず実行されます。
- ローディングアニメーションの解除などで使用されることが多いです。
必要に応じたオプションの追加
method
(またはtype
): リクエストの種類(GET, POST, PUT, DELETEなど)。data
: サーバーに送信するデータ(オブジェクトまたはクエリ文字列)。contentType
: サーバーに送るデータのMIMEタイプ(例:application/json
)。dataType
: サーバーから返されるデータの種類を指定(例:json
,html
,text
など)。beforeSend
: リクエスト送信前に実行する処理。
実用例: AJAXを使ったリクエスト
以下は、非同期でサーバーにリクエストを送信し、レスポンスを処理する例です。
$.ajax({
url: "/api/resource",
method: "POST",
data: JSON.stringify({ id: 123, name: "example" }),
contentType: "application/json",
headers: {
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"), // CSRFトークンをヘッダーに追加
},
success: function (response) {
console.log("成功:", response);
alert("リクエスト成功!");
},
error: function (xhr, status, error) {
console.error("エラー:", xhr.responseText);
alert("リクエスト失敗: " + xhr.responseText);
},
complete: function () {
console.log("通信完了");
},
});
$.ajax
のメリットと代替
メリット
- 非同期通信の柔軟性が高い。
- 細かい設定が可能。
代替手段
- よりシンプルな記述が必要な場合は
$.get
,$.post
などを使用。 - モダンな開発では
fetch API
やaxios
を使用することも一般的です。
fetch API
の例
以下は、fetch API
を使ったリクエストの例です。
fetch("/api/resource", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRF-TOKEN": "トークン値",
},
body: JSON.stringify({ id: 123, name: "example" }),
})
.then((response) => response.json())
.then((data) => console.log("成功:", data))
.catch((error) => console.error("エラー:", error));