【jQuery】$.post()でPOSTリクエストを送信する完全ガイド|JSON送信・エラーハンドリング・フォーム送信・fetch比較まで

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でアップロードしたいです。
AFormData を使います: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が標準的な設計です。