web-dev-qa-db-ja.com

リソースが見つからない場合、204または404応答を返す必要がありますか?

トーナメントとスケジュールのためのシンプルなRESTfulサービスを開発しています。 POST JSONボディを含むリクエストを通じてトーナメントが作成されると、そのトーナメントは、DAO実装で次のように宣言されたBiMapに挿入されます。

private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());

トーナメントが作成されると、それに関連付けられた文字列IDが返されるため、serはそのトーナメントの将来の参照を持つことができます。彼/彼女は次のリクエストを実行して新しいトーナメントから情報を得ることができます:

GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39

しかし、そのようなIDのトーナメントが見つからない場合はどうなりますか?これまでのところ、204応答を返しています。まあ、ジャージーはそのメソッドの1つからnullを返すときに私のためにやっています。これは、上記のルートに対応するメソッドです。

@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("id") String id) {
    Optional<Tournament> optTournament = tournamentDao.getTournament(id);
    if (optTournament.isPresent())
        return optTournament.get();
    return null;
}

私の質問は:204: No Content応答、または404代わりに、リソースが見つからなかったため、応答?

それを404に変更する必要がある場合、明らかな質問:メソッドの署名を変更する必要がありますか? (Tournamentタイプの)トーナメントが返されない可能性があるため、メソッドは異なるように見えるはずです。代わりにResponse型を戻り値の型として使用する必要がありますか?

15
dabadaba

_HTTP 204_は、何かあったが見つかったことを意味しますが、空です。たとえば、ログを提供しているとしましょう http://example.com/logs/ [date-goes-here] などのリクエストを含むHTTP経由のファイル。 2015年5月18日:

  • http://example.com/logs/2015-05-19 は_HTTP 404_を返します。これは、ログがないことを意味します。これは、将来をログに記録することが難しいためです。

  • http://example.com/logs/2015-05-18 は、ただし、応答のコンテンツにログエントリがある_HTTP 200_または_HTTP 204_を返します。ログファイルが作成されたが、この日付のログがまだ記録されていない場合。

nullをリクエストへの応答としてフレームワークに提供すると、エントリが見つかったと見なされ、このエントリは空なので、_HTTP 204_になります。代わりに、throw new NotFoundException();を使用して、エントリが存在しないことをフレームワークに示し、_HTTP 404_を生成する必要があります。

それを404に変更する必要がある場合、明らかな質問:メソッドの署名を変更する必要がありますか?

いいえ、必要ありません。これがthrow new NotFoundException();のいいところです。メソッドの実際の戻り値の型に関係なく機能します。

32

404を返す必要があります。NotFoundException( https://jersey.Java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html )をスローすることで実行できます。

また、返されるコンテンツタイプを制御する必要がある場合は、このSO質問を参照してください https://stackoverflow.com/questions/23858488/how-i-return-http-404 -json-xml-response-in-jax-rs-jersey-on-Tomcat

3
Chamindu

リクエストはGET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39です。

http://localhost:8080/eventscheduler/がエンドポイントとして存在しない場合は、404を返す必要があります。存在しないリソース(/eventscheduler/)にアクセスしようとしています。これは、サーバーがlocalhost:8080に存在することをクライアントに示しますが、eventschedulerエンドポイントには何もありません。

http://localhost:8080/eventscheduler/がエンドポイントとして存在するが、必要なリソースが利用できない場合は、5xxエラーが適切です。これの良い例は、503を返すことができるデータベースがオフラインの場合です。もちろん、特定のインスタンスではなく、一般的な500エラーを返すこともできます。

http://localhost:8080/eventscheduler/は存在するが、c15268ce-474a-49bd-a623-b0b865386f39で表されるものが存在しない場合は、詳細を示すボディを含む200を返します。エンドポイントが存在し、行われたリクエストは完全に有効で処理できましたが、一致しませんでした。

エンドポイントへのクライアントのリクエストが有効でない場合、他の4xxエラーを確認します。クライアントがエンドポイントまたは401または403で要求されたアイテムへのアクセスを許可されていないことを示すか、400を使用して要求が無効であることを示すことができます。これらのいずれかを使用すると、応答本文で追加情報を提供できます。

1
Thomas Owens