web-dev-qa-db-ja.com

詳細なRESTエラーメッセージをHTTP警告ヘッダーに入れる、良い/悪い考え?

標準のRESTサービスは、問題が発生した場合の応答コードとしてHTTPステータスコードを使用して開発しています(たとえば、無効なユーザー入力はクライアントに「400 BadRequest」を返します)

ただし、より詳細なエラーメッセージがクライアントにとって役立つと感じました。 (たとえば、無効な入力エラーは、Xが認識されないパラメーター名であることが原因です)

HTTP仕様にできるだけ忠実にしたいと考えているため、 RFC2616 の仕様を検討した後、詳細なエラーメッセージをHTTPヘッダーに含めることを検討しています。 HTTPヘッダー警告フィールド 。 RFCには、次のように書かれています。

警告general-headerフィールドは、メッセージに反映されない可能性のあるメッセージのステータスまたは変換に関する追加情報を伝達するに使用されます。この情報は通常、メッセージのエンティティ本文に適用されるキャッシュ操作または変換によるセマンティック透過性の欠如の可能性について警告するために使用されます。

このヘッダーを他の警告(RESTエラーメッセージなど))に使用することに制限はないようです。このヘッダーの本来の意図に従って、キャッシュ警告とは関係がない場合でも同様です。セマンティックであり、299警告コードを使用することを計画しました。これは法案に非常にうまく適合しているようです。

299その他の永続的な警告警告テキストには、任意の情報が含まれる場合があります人間のユーザーに提示されるか、ログに記録されます。この警告を受け取ったシステムは、自動化されたアクションを実行してはなりません(MUSTNOT)。

したがって、この質問の上部に提示された無効な入力エラーのケースを考えると、次の例のようにRESTエラーメッセージを表示することを考えています。

HTTP/1.1 400 Bad Request
Warning: 299 ServiceName "Invalid input error: X is unrecognized parameter name."

これは良いアイデア/実践ですか?また、一部のサービスがこのメッセージをX-Warningヘッダーで詳しく説明していることもわかりましたが、これは標準ではないようです。スタックオーバーフローのハイブの知恵REST群衆はこれについてどう思うだろうか。REST反応?

42
Ibrahim Arief

理由フレーズを変えてみませんか?それがその目的です。 「BadRequest」テキストはデフォルトです。より多くの情報を含めたい場合は、応答本文を使用してください。 HTTP仕様では、エラーの詳細を含む応答本文を含める必要があると規定されています。


更新

RFC 7231および関連資料の最近の読みに基づくと、理由句を変更する唯一の正当な理由は、より具体的な意味を提供することではなく、テキストをローカライズすることであるように思われます。申し訳ありません。

16
Darrel Miller

メッセージ本文(コンテンツ)または警告ヘッダーのいずれにフィードバックを配置する場合でも、システムで侵入テストを行う攻撃者に役立つ可能性のある情報を提供しないように注意してください。

情報が少ない方が良い場合もあります。

4
james.garriss

一般的にリクエストが成功した場合にのみ警告にヘッダーを使用することに賛成です。

たとえば、ユーザーの詳細を取得するサービスですが、詳細の一部は、頻繁にダウンするサードパーティからのものです。私たちの場合、ユーザーデータのそのセクションを空白のままにするのが適切でしたが、一部のデータが欠落していることをユーザーに警告します。

そのため、リクエストは、取得できるすべてのものを含むペイロードで200 Successを返しましたが、残りのエラーを説明する警告ヘッダーがありました。

1
CaptRespect

この提案 が受け入れられた場合、詳細エラーメッセージを送信するための代替手段が提示されます。 [ http://tools.ietf.org/html/draft-nottingham-http-browser-hints ]

I-Dですが、最近はかなり安定しており、独自の実装を構築しても問題はありません。 (私はやりました。)

0
Matty K

私は一般的なアプローチに賛成です。クライアント開発者はサービス開発者とは異なるチームに属していると想定する必要があります。おそらく、異なるタイムゾーンなどです。おそらく別の会社でさえあります。 「いいえ、それは悪い要求です」という応答を返すだけではダメです。クライアントはどのようにして問題を修正できますか。

だから哲学的に:彼らが修正する責任があることについてクライアントに伝えてください。純粋にサーバーの範囲であるエラー(データベース接続エラー、または何らかの論理的な問題など)は、500エラーを返すだけで問題ありません。そして、ここでは詳細を送り返しません。内部実装の詳細をクライアントに公開したくありません。

これまで、JAX/RSを使用して、応答の本文でデータを返してきました。

return Response.status(400).entity("some message here").build();

ヘッダーの使用は、実際にはよりクリーンなアプローチになると思います。

0
djna

429 Too Many Requests(RFC 6585)ユーザーが指定された時間内に送信したリクエストが多すぎます。レート制限スキームでの使用を目的としています。

ライフタイムごとに1つのリクエストを許可しているため、レート制限スキームを実装しているため、これが適切なHTTP応答です。

HTTP応答の本文をカスタマイズすることもできます(HTTP仕様で推奨されています)。そのため、「TooManyRequests」を任意の説明に変更できます。

0
Neil Davis