HTTP ステータスコード 428 Precondition Requiredとは? 原因と解決方法を徹底解説


HTTP ステータスコード 428 Precondition Required は、クライアントがリクエストを送信する前に、特定の条件を満たす必要があることを示します。これは、キャッシュされたリソースの更新や、競合状態の防止など、さまざまな目的に使用されます。

条件不備の例

428 エラーが発生する一般的なシナリオは以下の通りです。

  • ロックトークンの欠如
    リソースの更新を許可するには、クライアントがロックトークンを提供する必要がある場合があります。トークンが提供されていない場合、サーバーは 428 エラーを返します。
  • ETag ヘッダーの不一致
    クライアントが指定した If-Match ヘッダー値が、サーバー側の ETag ヘッダー値と一致しない場合、428 エラーが発生します。
  • If-Match ヘッダーの欠如
    クライアントが If-Match ヘッダーを指定せずに PUT または DELETE リクエストを送信した場合、サーバーは 428 エラーを返します。このヘッダーは、クライアントが更新しようとしているリソースの最新バージョンを持っていることをサーバーに示します。


クライアント側(Python)

import requests

url = "https://example.com/resource"
headers = {
    "If-Match": "etag-value",  # 不正な ETag 値
}

response = requests.put(url, headers=headers)

if response.status_code == 428:
    print("428 Precondition Required error")
else:
    print("Success")

サーバー側(Node.js)

const express = require('express');
const app = express();

app.put('/resource', (req, res) => {
  const ifMatchHeader = req.headers['if-match'];
  if (!ifMatchHeader || ifMatchHeader !== 'valid-etag-value') {
    res.status(428).send('Precondition Required');
  } else {
    // リソースを更新
    res.status(200).send('Success');
  }
});

app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

この例では、クライアントは If-Match ヘッダーに不正な値を設定して PUT リクエストを送信します。サーバーは 428 エラーを返し、クライアントが正しい ETag 値を指定する必要があることを示します。

これはあくまでも一例であり、428 Precondition Required エラーを発生させる方法は他にもたくさんあります。具体的な状況に応じて、適切なコードを記述する必要があります。

  • セキュリティ上の理由から、実際のコードでは機密情報 (API キーなど) をハードコーディングしないでください。
  • 上記のコードはあくまで例であり、本番環境で使用するためには適切なライブラリとエラー処理を追加する必要があります。


前提条件を省略する

428 エラーが発生する最も一般的な理由は、クライアントがリクエストに必要な前提条件ヘッダーを提供していないことです。このような場合は、ヘッダーを省略し、サーバー側で適切に処理できるようにする設計を検討できます。ただし、この方法には、データの整合性や競合状態のリスクが高まるという欠点があります。

代替のステータスコードを使用する

状況によっては、428 エラーよりも適切な代替ステータスコードを使用できる場合があります。例えば、以下のような選択肢があります。

  • 409 Conflict
    リソースの更新中に競合状態が発生した場合
  • 403 Forbidden
    クライアントにリクエストされたリソースへのアクセスが許可されていない場合
  • 400 Bad Request
    クライアントのリクエストが構文的に正しくない場合

カスタムエラーメッセージを返す

より詳細な情報を提供するために、428 エラーと共にカスタムエラーメッセージを返すことができます。これにより、開発者やユーザーがエラーの原因をより簡単に特定できるようになります。

  • 詳細なエラーメッセージを返して、問題の診断と解決を容易にします。
  • 適切なステータスコードを使用して、エラーの種類を明確に伝えます。
  • ETag やロックトークンなどのメカニズムを使用して、キャッシュされたリソースの競合状態を防止します。
  • クライアントがリクエストに必要なすべての前提条件ヘッダーを提供していることを確認してください。