jQueryの $.post() を使うと、ページをリロードせずにサーバーへデータを送信できます。この記事では基本的なPOST送信・JSON送信・フォームデータの非同期送信・エラーハンドリング・Fetch APIとの比較まで解説します。
この記事でわかること
- $.post() の基本的な使い方
- JSONデータをPOSTする方法
- フォームを非同期(Ajax)で送信する方法
- エラーハンドリング(.fail())の実装
- $.ajax() / fetch() との使い分け
$.post() の基本的な使い方
// $.post(url, data, callback)
$.post('/api/save', { name: '山田太郎', age: 30 }, function (response) {
console.log('レスポンス:', response);
});
// Promiseチェーンで書く(推奨)
$.post('/api/save', { name: '山田太郎', age: 30 })
.done(function (data) {
console.log('成功:', data);
})
.fail(function (jqXHR, textStatus, errorThrown) {
console.error('エラー:', textStatus, errorThrown);
})
.always(function () {
// 成功・失敗に関わらず実行
console.log('通信完了');
});
コールバック方式よりPromiseチェーンが推奨
.done()/.fail()/.always() を使うとエラーハンドリングが分離され、可読性が上がります。複数のAjaxを順番に実行する場合は $.when() と組み合わせてください。JSONデータをPOSTする
デフォルトの $.post() は application/x-www-form-urlencoded 形式で送信します。JSON形式で送りたい場合は $.ajax() を使います。
// JSONをPOSTする場合は $.ajax() を使う
$.ajax({
url: '/api/save',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ name: '山田太郎', age: 30 }),
dataType: 'json'
})
.done(function (data) {
console.log('成功:', data);
})
.fail(function (jqXHR) {
console.error('エラー:', jqXHR.status, jqXHR.responseText);
});
contentType と dataType の違い
contentType: リクエストボディの形式(サーバーへの通知)。dataType: レスポンスの期待形式(jQueryがパースする)。JSONをPOSTするなら contentType: "application/json" とdata: JSON.stringify(...) の両方が必要です。フォームを非同期(Ajax)で送信する
<form id="contact-form"> <input type="text" name="name" placeholder="お名前"> <input type="email" name="email" placeholder="メールアドレス"> <textarea name="message" placeholder="メッセージ"></textarea> <button type="submit">送信</button> </form> <p id="form-message"></p>
$(function () {
$('#contact-form').on('submit', function (e) {
e.preventDefault(); // 通常の送信をキャンセル
var $btn = $(this).find('button[type=submit]');
$btn.prop('disabled', true).text('送信中...');
$.post('/api/contact', $(this).serialize())
.done(function (data) {
$('#form-message').text('送信が完了しました').css('color', 'green');
$('#contact-form')[0].reset(); // フォームをリセット
})
.fail(function (jqXHR) {
var msg = jqXHR.status === 422
? '入力内容に誤りがあります'
: '送信に失敗しました。しばらくしてから再度お試しください';
$('#form-message').text(msg).css('color', 'red');
})
.always(function () {
$btn.prop('disabled', false).text('送信');
});
});
});
送信中はボタンを無効化して二重送信を防ぐ
フォーム送信中にボタンを
フォーム送信中にボタンを
disabled にすることで、ユーザーが誤って複数回クリックして二重送信するのを防げます。.always() で必ずボタンを再有効化してください。エラーハンドリングの詳細
$.post('/api/save', { name: '山田' })
.done(function (data, textStatus, jqXHR) {
console.log('ステータス:', jqXHR.status); // 200
console.log('データ:', data);
})
.fail(function (jqXHR, textStatus, errorThrown) {
switch (jqXHR.status) {
case 400: console.error('不正なリクエスト'); break;
case 401: console.error('認証が必要です'); break;
case 403: console.error('アクセス権限がありません'); break;
case 404: console.error('エンドポイントが見つかりません'); break;
case 422: console.error('バリデーションエラー'); break;
case 500: console.error('サーバーエラー'); break;
default: console.error('予期しないエラー:', jqXHR.status);
}
// レスポンスがJSONの場合はパースして詳細を取得
try {
var errData = JSON.parse(jqXHR.responseText);
console.error('エラー詳細:', errData.message);
} catch (e) {}
});
$.post() / $.ajax() / fetch() の使い分け
| 方法 | 特徴 | 推奨場面 |
|---|---|---|
$.post() |
シンプル・jQueryが必要 | フォーム/URLエンコードの簡易送信 |
$.ajax() |
細かい設定が可能・jQueryが必要 | JSON送信・カスタムヘッダー・認証トークン付与 |
fetch() |
標準API・jQuery不要・async/await対応 | モダンJS環境・新規プロジェクト |
新規プロジェクトや jQuery を使わない環境では fetch() + async/await が現代標準です。
まとめ
jQueryでPOSTリクエストを送信する際のポイントをまとめます。
- 基本:
$.post(url, data)→.done()/.fail()/.always() - JSON送信:
$.ajax({ contentType: "application/json", data: JSON.stringify(...) }) - フォーム:
$(form).serialize()でシリアライズ → ボタン無効化で二重送信防止 - エラー: ステータスコード別に分岐 →
jqXHR.responseTextで詳細取得
関連記事: GETリクエストを送信する方法 / JSONデータを取得する方法 / フォームバリデーション完全ガイド
よくある質問(FAQ)
QCORSエラーが出ます。
ACORS(Cross-Origin Resource Sharing)エラーはサーバー側の設定で解決します。サーバーのレスポンスヘッダーに
Access-Control-Allow-Origin: * または 特定のオリジンを追加してください。クライアント側のjQueryコードでCORSは解決できません。サードパーティAPIのCORSを回避する場合は、自社サーバーをプロキシにする方法を検討してください。QCSRFトークンをヘッダーに付与したいです。
A
$.ajaxSetup() で全リクエストに共通ヘッダーを設定できます:$.ajaxSetup({ headers: { "X-CSRF-Token": $('meta[name="csrf-token"]').attr("content") } })Laravel/RailsなどのフレームワークではメタタグにCSRFトークンを埋め込む方式が一般的です。QファイルをPOSTでアップロードしたいです。
A
FormData を使います:var fd = new FormData(); fd.append("file", fileInput.files[0]); $.ajax({ url: "/upload", type: "POST", data: fd, processData: false, contentType: false })processData: false, contentType: false の両方が必要です。これを省くとjQueryがデータを不正に変換してしまいます。QPromiseではなくasync/awaitで書きたいです。
AjQueryの
$.ajax() はPromise互換ではないため、await はそのままでは使えません。fetch() を使えばネイティブPromiseでasync/awaitが使えます:const res = await fetch("/api/save", { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" } })jQueryを維持したい場合は Promise.resolve($.post(...)) でラップする方法もあります。QPOSTとGETの使い分けはどうすればよいですか?
AGETはデータの取得(URLにパラメーターが付く・ブラウザにキャッシュされる)、POSTはデータの送信・変更(ボディにデータが入る・キャッシュされない)に使います。機密情報(パスワード・個人情報)はGETのURLに含めてはいけません。REST APIでは取得=GET、作成=POST、更新=PUT/PATCH、削除=DELETEが標準的な設計です。
