トーナメントとスケジュールのためのシンプルな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
型を戻り値の型として使用する必要がありますか?
_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();
のいいところです。メソッドの実際の戻り値の型に関係なく機能します。
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
リクエストは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を使用して要求が無効であることを示すことができます。これらのいずれかを使用すると、応答本文で追加情報を提供できます。