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 やロックトークンなどのメカニズムを使用して、キャッシュされたリソースの競合状態を防止します。
- クライアントがリクエストに必要なすべての前提条件ヘッダーを提供していることを確認してください。