3

特定のリクエストが行われたときに 404 レスポンスを返すことができる JAX-RS リソース クラスがあります。残念ながら、操作のメソッドに注釈が付けられていても@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })、404 応答オブジェクトは常に、Tomcat が独自の「見つかりません」HTML エラー ページを本体に押し込みます。

これは、XML/JSON 応答を期待するクライアントを壊しています。このような場合、Tomcat をシャットダウンするにはどうすればよいですか?

私のコードは次のようになります。

@GET
@Path("isbn/{isbn}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response isbn(@PathParam("isbn") String isbn) {

    ProductSearchDO productSearch = ProductSvc.find( isbn );
    if (productSearch == null)
        return Responses.notFound().build();

    return Response.ok( productSearch ).tag( String.valueOf( productSearch.hashCode() ) ).build();
}
4

2 に答える 2

2

404 を返すべきではありません。空の JSON を返すだけで、クライアントはそれを処理できます。

このアプローチは「ソフト 404」と呼ばれます (私が間違っていなければ)。

このアプローチは Facebook でも使用されています。

https://graph.facebook.com/search?q=nlknrekjfndjkfnsjkefbnejkrbfjedbfjekfbekj

編集:

私はそれをよりよく説明します。W3Cが言うように、次の場合は 404 を使用する必要があります。

サーバーは Request-URI に一致するものを見つけられませんでした。

実際には、サーバーは一致する Request-URI を見つけましたが、単に応答が空になります。また、

このステータス コードは、サーバーが要求が拒否された理由を正確に明らかにしたくない場合、または他の応答が適用できない場合によく使用されます。

必要に応じて、別の種類の応答を適用できます。

それでもやりたい場合は、標準の Tomcat 404 ページを空のページでオーバーライドするか、クライアント側にステータス コードを確認するように依頼できます。

if(statusCode==404) { blablabla }

EDIT2:

何に対する反対票?私の答えが間違っているとは思いません。好むと好まざるとにかかわらず、実際に間違っているとは思いません。

あなたの場合、特定の製品の調査を行っています。検索に一致する製品が見つからない場合、なぜ 404 を返す必要があるのでしょうか?

これに関するその他の情報源:

RESTful API はオブジェクトの配列に対して 404 を返す必要がありますか?

ここもまた:

REST リソース URL のクエリ文字列

「URL が検索結果を返す場合、404 を返すべきではありません。」

ここでも同じです:

REST: 404 HTTP ステータス コード 、特にコメントのマッピング:

簡単に言えば、「結果なし」は有効な検索結果です。リソースは存在しますが、その表現は単に「空」です。したがって、404 は正当化されません。

于 2012-10-03T14:08:48.453 に答える
0

404 Not Found存在しないページをリクエストしたクライアント側に問題があることを意味するクライアント エラーです。この場合、404 を返すのが理にかなっています。

クライアントは 404 応答を適切に処理できるはずだと私は主張します。サーバーとしてのあなたは、エラー コードを返すことでデューデリジェンスを行っています。応答を処理できるかどうかは、クライアント次第です。

于 2014-02-21T14:30:50.773 に答える