1. ホーム
  2. http

[解決済み] 空のテーブルに対する適切なRESTレスポンス?

2022-07-11 09:09:36

質問

を呼び出して、ユーザのリストを取得したいとします。 GETapi/users に変更しましたが、現在テーブルが切り捨てられたため、ユーザーは存在しません。このシナリオの適切な応答は何ですか。 404 または 204 ?

どのように解決するのですか?

どちらとも言えません。

なぜ404(Not Found)ではないのですか?

404 ステータスコードは、リソースが見つからない状況のために確保されるべきです。この場合、あなたのリソースは ユーザーのコレクション . このコレクションは存在しますが、現在は空です。個人的には、あなたのアプリケーションのクライアントの作者として、もし私が 200 を受け取ったのに、ある日 404 が表示され、次の日には誰かがユーザーを数人削除しただけで表示されます。私はどうしたらいいのでしょうか?私のURLは間違っているのでしょうか?誰かがAPIを変更し、リダイレクトを残すのを怠ったのでしょうか。

204 (No Content)ではないのですか?

からの抜粋です。 w3c による 204 ステータス コードの説明です。

サーバーはリクエストを満たしましたが、エンティティボディを返す必要はなく、更新されたメタ情報を返したいと思っている可能性があります。

この場合、合理的に見えるかもしれませんが、クライアントを混乱させることにもなると思います。A 204 は、ある操作が正常に実行され、データを返す必要がないことを示すことになっています。への応答としては完璧です。 DELETE リクエストに対する応答として、あるいはデータを返す必要のないスクリプトを実行する際に最適です。の場合は api/users の場合、通常はユーザーのコレクションを受け取ることを期待します。あるときはレスポンス ボディを送信し、別のときは送信しないというのは、一貫性がなく、誤解を招く可能性があります。

200 (OK) を使用する理由

上記の理由(一貫性)により、私なら空のコレクションの表現を返します。XML を使用していると仮定しましょう。ユーザーの空でないコレクションに対する通常のレスポンスボディは、次のようになります。

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

で、リストが空の場合は、このようなもので対応すればよいでしょう(ただし 200 ):

<users/>

いずれにせよ、クライアントは特定のよく知られた形式に従ったレスポンスボディを受け取ります。不必要な混乱やステータスコードのチェックはありません。また、ステータスコードの定義に違反することもありません。誰もがハッピーになれます。

JSONでもHTMLでも、どんなフォーマットでも同じことができます。