複雑なレポートを実行するためにボタンをクリックしたばかりかもしれません。あるいは、ビデオのトランスコーディングジョブをリクエストしたのかもしれません。ページが数分間フリーズする代わりに、すぐに「リクエストは処理のために受け付けられました」というメッセージが表示されます。数分後、完成したレポートへのリンクが記載されたメールが届きます。
このスムーズな非同期エクスペリエンスは、適切に設計された最新のソフトウェアの証です。そして、それは重要でありながら、しばしば誤解されているHTTPステータスコードである202 Accepted
によって支えられています。
「今すぐ完了しました」と伝える200 OK
や、「新しいものを作成しました」と伝える201 Created
とは異なり、202 Accepted
ステータスコードは期待値を管理するためのものです。これは、サーバーが「メッセージを受け取りました。何をすべきか理解しています。今すぐ結果をお渡しすることはできませんが、キューに入れましたので処理します。待つ必要はありません」と伝える方法です。
これは、忙しいレストランの案内係にチケットを渡すことのデジタル版です。すぐに料理が運ばれてくるわけではありませんが、順番が確保されており、いずれ食事が準備されることを信頼しています。
時間のかかるタスクを処理するAPIを構築または使用している場合、202 Accepted
を理解することは、応答性が高く、スケーラブルで、ユーザーフレンドリーなアプリケーションを作成するための鍵となります。
では、これは何を意味し、なぜ開発者、テスター、APIコンシューマーにとって理解することが重要なのでしょうか?
その仕組みに入る前に、非同期ワークフローを必要とするAPIを設計している場合、これらの複雑なインタラクションをテストおよび視覚化するのに役立つツールが必要です。Apidogを無料でダウンロードしてください。これは、202
応答を簡単にシミュレートし、ポーリングメカニズムをテストし、非同期プロセスが堅牢で信頼できることを確認できるオールインワンAPIプラットフォームです。
さて、202 Accepted
が何を意味するのか、いつ使用すべきか、そしてどのように正しく実装するのかを詳しく見ていきましょう。
ステージ設定:同期思考の問題点
202
が必要な理由を理解するには、まず同期リクエストの制限を認識する必要があります。
典型的なHTTPリクエスト・レスポンスサイクルは同期型でブロッキングです。
- クライアント: リクエストを送信します。
- クライアント: 待機します... (これは「最初のバイトまでの時間」またはTTFBと呼ばれることが多いです)。
- サーバー: リクエストを処理します (これには複雑な計算、データベースクエリ、他のサービスの呼び出しが含まれる場合があります)。
- サーバー: レスポンスを送信します (
200 OK
、201 Created
など)。 - クライアント: レスポンスを受信し、それに基づいて動作します。
このモデルは、ユーザープロファイルの取得、製品リストの取得、単一フィールドの更新といった迅速な操作には完璧に機能します。しかし、操作に5秒、30秒、5分かかるとしたらどうでしょうか?
- 接続がタイムアウトし、エラーにつながる可能性があります。
- ユーザーのブラウザやアプリがフリーズしたように見え、ひどいユーザーエクスペリエンスを生み出します。
- サーバープロセスが占有され、他の受信リクエストを処理できなくなり、スケーラビリティの低下につながります。
202 Accepted
ステータスコードは、この問題に対する洗練された解決策です。これはHTTPのブロッキングの性質を打ち破り、非同期処理を可能にします。
HTTP 202 Acceptedは実際に何を意味するのか?
HTTP 202 Accepted
ステータスコードは、RFCで成功応答として定義されています。ただし、これは非常に特定の種類の成功です。202 Acceptedステータスコードは、一般的に成功を示す2xxカテゴリに属します。これは次のことを示します。
- リクエストは受信され、理解された。
- リクエストは処理のために受け付けられた。
- 処理はまだ完了していない。
- 処理は最終的に完了したアクションになる場合もあれば、ならない場合もある(後で失敗することさえある)。
しかし、リクエストが正常に処理され完了したことを意味する200 OK
とは異なり、202は異なることを伝えています。
サーバーはリクエストを受け付けましたが、処理はまだ完了していません。
重要なことに、レスポンスはクライアントがリクエストのステータスを確認できる場所、または最終結果が将来利用可能になる場所について何らかのヒントを与えるべきです。
言い換えれば、202はサーバーが丁寧に伝える方法です。
「やあ、君のリクエストは受け取ったよ。今処理中だ。でも、すぐに結果を期待しないでね。」
このため、メール送信、大規模なデータセットの処理、バックグラウンドジョブの開始など、時間のかかる非同期操作プロセスに特に役立ちます。
なぜ202 Acceptedが存在するのか?
すべてのリクエストが即座に処理できるわけではありません。APIコールを送信するたびに、サーバーがジョブ全体が完了するまで待ってから応答しなければならないと想像してみてください。それは次のことにつながる可能性があります。
- 時間のかかるタスクでのタイムアウト。
- クライアントがハングするため、劣悪なユーザーエクスペリエンス。
- ジョブが終了するまでリソースが占有されるため、サーバーの過負荷。
202ステータスコードは、サーバーがクライアントを待たせることなくリクエストを承認できるようにすることで、この問題を解決します。
非同期ワークフロー:ステップバイステップの内訳
具体的な例を見てみましょう。パーソナライズされたデータレポートを生成するAPIを想像してください。
ステップ1:クライアントのリクエスト
クライアントアプリケーションは、レポート生成を開始するためにPOST
リクエストを送信します。
POST /api/reports/generate HTTP/1.1Host: api.example.comContent-Type: application/jsonAuthorization: Bearer <token>
{
"type": "annual_sales",
"year": 2023,
"format": "pdf"
}
ステップ2:サーバーの202応答
サーバーはリクエストを受信します。リクエストが適切に形成され、ユーザーが認証されていることを検証します。その後、すぐにジョブを処理キューに入れ(Redis、RabbitMQ、Amazon SQSなどのシステムを使用して)、応答します。
HTTP/1.1 202 AcceptedLocation: <https://api.example.com/api/reports/status/job-12345Content-Type:> application/json
{
"message": "Your report generation request has been accepted and is being processed.",
"job_id": "job-12345",
"status_url": "<https://api.example.com/api/reports/status/job-12345>",
"estimated_completion_time": "2023-10-27T10:05:00Z"
}
この応答は非常に強力です。詳しく見ていきましょう。
HTTP/1.1 202 Accepted
: コアメッセージ:「受け取りました。」Location
ヘッダー: リクエストのステータスを監視できるURLを指す標準的なHTTPヘッダーです。これは202応答のベストプラクティスです。- レスポンスボディ: 次に何が起こるかについての役立つ、人間にも機械にも読みやすい情報を提供します。
job_id
とstatus_url
は非常に重要です。
ステップ3:非同期処理
クライアントはこれで他のことを自由に行うことができます。一方、サーバー側では:
- 別個のバックグラウンドワーカー(またはプロセス)がキューからジョブをピックアップします。
- 時間のかかるタスク(データベースのクエリ、データのコンパイル、PDFの生成)を実行します。
- 完了すると、結果を保存し(例:S3のようなクラウドストレージに)、ジョブステータスを「完了」に更新します。
ステップ4:クライアントが完了を確認する
クライアントは、202応答で提供されたstatus_url
をポーリングできるようになりました。
GET https://api.example.com/api/reports/status/job-12345
このポーリングリクエストに対する応答は、時間の経過とともに変化する可能性があります。
- 初期段階:
{"status": "processing", "progress": 45}
- 完了時:
{"status": "completed", "download_url": "<https://api.example.com/api/reports/download/job-12345.pdf>"}
あるいは、サーバーはクライアントが提供したURLにウェブフックを介して通知を送信することもできます。これはポーリングよりも高度で効率的なパターンです。
202 Acceptedの主な特徴
202応答の重要な特性を以下に示します。
- リクエスト受信済み: サーバーはあなたのリクエストを受け取りました。
- 処理は未完了: 実際のジョブはまだ進行中です。
- 完了の保証なし: 200とは異なり、202はジョブが成功することを約束するのではなく、受け入れられたことだけを意味します。
- 非同期ワークフローに有用: バックグラウンドジョブ、キュー、または遅延処理。
202 Acceptedと他の成功コード:違いを知る
202
を他の2xxコードと混同しがちです。ここに簡単なチートシートがあります。
200 OK
: 「リクエストを正常に処理しましたそして結果は今すぐここにあります。」(同期、即時結果)201 Created
: 「新しいリソースを今すぐ正常に作成しました。その場所とデータはここにあります。」(同期、即時作成)202 Accepted
: 「リクエストを処理します。結果については後で確認してください。」(非同期、遅延処理)204 No Content
: 「リクエストを正常に処理しましたが、返送するコンテンツはありません。」(同期、ボディなし)
結果がすぐにではなく、将来利用可能になる場合に202
を使用します。
なぜ202 Acceptedを使用するのか?主な利点
- ユーザーエクスペリエンス(UX)の向上: クライアントアプリケーションは応答性を維持します。ユーザーは、デススピンの代わりに、リクエストが受信されたという即座のフィードバックを受け取ります。
- サーバーのスケーラビリティの向上: サーバーの主要なリクエスト処理スレッドはほぼ瞬時に解放されます。重い処理はバックグラウンドワーカーに委譲され、サーバーはより多くの受信リクエストを処理できるようになります。
- 不確実性への対応: サーバーは、後で完全に満たされるかどうか100%確信がなくても、リクエストを受け入れることができます。たとえば、一時的に停止しているサードパーティサービスに依存するリクエストを受け入れる場合があります。
- 複雑な操作に対する現実性: メール送信、ビデオ処理、機械学習モデルの実行、大規模なデータエクスポートなど、時間のかかる現実世界のプロセスを正確にモデル化します。
HTTP 202の実際のユースケース
多くの最新のアプリケーションで202 Accepted
に遭遇するでしょう。
- ファイル処理: 画像/ビデオのトランスコーディング、ドキュメント変換(例:PDF生成)。
- データ操作: 大規模レポート生成、データのエクスポート/インポート、一括メール送信。
- AI/機械学習: モデルトレーニングまたは推論のためのタスク提出。
- 決済処理: 一部の決済ゲートウェイは、決済リクエストを非同期で受け付けます。
- DevOps/CI-CD: ビルドパイプラインのトリガー。APIはリクエストを即座に受け付け、ビルドログへのリンクを返します。
202 Acceptedを使用する利点
開発者やAPI設計者はなぜ202を使用すべきなのでしょうか?
- クライアントのタイムアウトを防ぐ: ユーザーは待つ必要がありません。
- スケーラビリティを向上させる: サーバーが時間のかかるタスクでロックアップされません。
- より良いユーザーフィードバック: 沈黙ではなく、クライアントはリクエストが処理中であることを知ります。
- 非同期アーキテクチャをサポート: 最新のマイクロサービスに不可欠です。
非同期ワークフローにおける202 Accepted
一般的な動作は次のとおりです。
- クライアントがリクエストを送信する。
- サーバーが202で応答する(場合によっては「ステータスURL」も)。
- クライアントがステータスエンドポイントに再度確認することで、ジョブが完了したかを確認する。
例えば:
{
"status": "processing",
"check_status": "/jobs/12345/status"
}
このパターンは双方を満足させます。クライアントは即座に承認を受け取り、サーバーは余裕を得ます。
Apidogを使った202ワークフローのテスト

非同期APIフローのテストは、単純な同期呼び出しのテストよりも複雑です。ここでApidogが非常に貴重なツールとなります。
Apidogを使用すると、次のことができます。
- フローをスクリプト化: まず
POST
リクエストを送信し、status_url
を含む202
が返されることを検証するテストシナリオを作成します。 - 変数を抽出: Apidogのスクリプト機能を使用して、
202
応答からjob_id
またはstatus_url
を自動的に抽出し、環境変数として保存します。 - ポーリングをテスト: 抽出された変数を使用して
status_url
を呼び出す後続のGET
リクエストを作成します。Apidogを構成して、このリクエストが「完了」ステータスを受け取るまで再試行させることができます。 - 最終結果を検証: ジョブが完了したら、ダウンロードURLからの最終応答を検証するためのアサーションを記述します。
これにより、非同期ジャーニー全体のテストを自動化し、信頼性を確保し、回帰を捕捉することができます。
202 Accepted応答をテストする方法(Apidogを使用)

ここでApidogが真価を発揮します。静的なツールとは異なり、Apidogでは次のことができます。
- リクエストを送信し、異なるステータスコード(202など)をシミュレートする。
- 非同期ワークフローをテストするためにAPIエンドポイントをモックする。
- 開発者が202応答から何を期待すべきかを知るためにAPIを文書化する。
- 非同期処理を改善するためにチームメンバーと共同作業する。
Apidogを使用すると、ツールを切り替えることなく、受け入れから完了までエンドツーエンドの202ワークフローを構築およびテストできます。
潜在的な落とし穴とよくある誤解
とはいえ、202は誤用される可能性があります。いくつかの落とし穴は次のとおりです。
- 完了を前提とする: リクエストが受け付けられたからといって、成功したとは限りません。
- フォローアップを提供しない: APIは、クライアントがジョブステータスを確認する方法を含めるべきです。
- 202の使いすぎ: 単純で即時の操作には使用しないでください。クライアントを混乱させます。
課題とベストプラクティス
202
を正しく実装するには、慎重な検討が必要です。
- ステータスエンドポイントを提供する: これは譲れません。クライアントがリクエストの進行状況と最終結果を確認できるURL(
Location
ヘッダーまたはレスポンスボディ経由で)を必ず提供する必要があります。 - べき等性は重要: クライアントがリクエストが通ったかどうか確信が持てない場合(例:ネットワークの問題のため)、再試行する可能性があります。APIは、同じジョブが複数回キューに入れられるのを防ぐために、べき等キーを使用して重複リクエストを適切に処理するように設計する必要があります。
- 明確な期待値を設定する: レスポンスボディを使用して、完了までの推定時間や簡単なステータスメッセージ(
queued
、processing
、failed
、succeeded
)を提供します。 - ウェブフックを検討する: ポーリングに代わるより効率的な方法として、クライアントがジョブ完了時にサーバーが呼び出すウェブフックURLを登録できるようにします。
- 失敗に備える: ジョブはバックグラウンドで失敗する可能性があります。ステータスエンドポイントは、失敗を伝え、場合によっては理由コードを提供する必要があります。
202 Acceptedを実装するためのベストプラクティス
202を返すAPIを設計している場合は、これらのベストプラクティスを念頭に置いてください。
- 常にコンテキストを返す: ジョブIDまたはステータスURLを提供します。
- 明確に文書化する: クライアントがどのように進捗状況を確認すべきかを説明します。
- 可能な場合はウェブフックを使用する: タスクが完了したときにクライアントに通知します。
- 使いすぎない: 真に非同期なタスクにのみ202を返します。
RESTとGraphQL APIにおける202 Accepted
- REST API: リクエストが長時間実行されるプロセスにマッピングされることが多いため、202は一般的です。
- GraphQL API: GraphQLは同期クエリを好むため一般的ではありませんが、非同期ミューテーションでは可能です。
結論:非同期設計の採用
HTTP 202 Accepted
ステータスコードは、API設計者のツールキットにおける強力なツールです。これは、APIを単純なリクエスト・レスポンスメカニズムとして考えることから、複雑な現実世界のワークフローを調整するシステムとして考えることへの転換を表しています。202 Acceptedステータスコードは最も有名なHTTPコードではないかもしれませんが、非同期APIワークフローにおいて重要な役割を果たします。これはクライアントに「リクエストは受け取りましたが、まだ処理中です。」と伝えます。
202
を使用することで、よりスケーラブルで、より回復力があり、それを使用する開発者や最終的に恩恵を受けるエンドユーザーにとって、はるかに優れたエクスペリエンスを提供するAPIを構築できます。
これは、ソフトウェアのすべてが瞬時に起こるわけではないことを認識し、その現実を処理するための標準化された堅牢な方法を提供します。
ですから、次回、時間のかかるタスクのエンドポイントを設計する際には、同期に強制しないでください。タスクの非同期性を採用してください。202 Accepted
を返し、ステータスURLを提供し、アプリケーションを待機リクエストの束縛から解放してください。202を返すAPIを構築またはテストしている場合、これらのワークフローを手間なくシミュレート、テスト、文書化できるツールが必要です。Apidogが提供するのはまさにそれです。Apidogのようなツールを使用して、実装が堅牢で、テスト可能で、統合しやすいことを確認してください。APIテストとドキュメントを簡素化する準備はできましたか?今すぐApidogを無料でダウンロードして、202 Acceptedのようなコードの処理を簡単にしましょう。