未知のパラメーターを許容する必要がありますか?


12

私はRESTful APIを設計していますが、タイトルの問題に直面しました。

クライアントが認識されないパラメーターを送信した場合、高速で失敗する必要がありますか?例えば、

http://example.com/api/foo?bar=true&paula=bean

上記でbarは、は有効なパラメーターですがpaula、APIによって指定されていません。したほうがいい

  • クライアントにエラーを警告する
  • 早く失敗する
  • それを無視します

クライアントに警告する場合、最初のパラメーターに対して警告を発行できるのは、ほぼ無限の数のパラメーターを送信している可能性があり、サーバーにはおそらくより良いことがあるからです。同様に、失敗すると、最初の無効なパラメータのみが問題として指定されます。

警告を出すよりもプログラマーに強制的に行動を起こさせるよりも失敗を好む。そうでなければプログラマーは問題を無視してリソースを浪費し続けるかもしれない。その点で何もしないのはさらに悪いことです。

私の議論は理にかなっていますか?そのようなことに関して受け入れられている慣行はありますか?


小規模なテストに基づいて、テストしたすべてのサイトは、提供した未知のパラメーターを単に無視します。
バートヴァンインゲンシェナウ

@BartvanIngenSchenau同じです。Webページには問題ありませんが、実際のAPIには問題ないと思います
-rath

2
懸念事項は前方互換性です。未知の引数が無視される場合、クライアントが新しいAPIにプログラムできるように、将来のバージョンでそれらを使用することができ、それでも古いサーバーで適切な動作を取得できます。
walpen

@walpenそれは興味深い点です。バージョン管理されたURL api/v1などを使用することで対処できますが、それでも増分更新は許可されません。+1
ラット

ここでは、実際のライブの観点からいくつかの長所と短所を見つけることができます。厳密なパラメーターとAPIです。
レメックアンブロジアック

回答:


12

私の意見では、Invalid Requestステータスを返すべきです。そうすれば、クライアントがやろうとしていることが無効であることがクライアントにわかります。これに関する私の意見は、RESTful APIが発見可能でれます。前もって十分な情報を提供している場合、クライアントは最初から無効な要求をしようとしません。存在する場合、クライアントコードに何らかの問題があり、高速で失敗すると、2番目にこのバグが警告されます。もちろん、これは非常に純粋なアプローチであり、APIが発見できない場合はお勧めできません。

より実用的なアプローチは、無効なパラメータを無視することかもしれませんが、どちらにしても、動作をよく文書化してください。


1
拡張として:クライアントがいくつかの不明/読み取り専用/非推奨のパラメーターを送信する場合、それはクライアントが満たされない何らかの動作を期待することを意味します。したがって、何らかのアクションを実行することは危険です。私は同意します、厳密に悪い要求
ステパンStepanov

@StepanStepanovに感謝しますが、Webアーキテクチャの多くの根底にある「受け入れるものを許容し、送信するものを明示する」という哲学があります。それを念頭に置いて、すでに書いたものに直接反対する答えを簡単に書くことができました。
ラバーダック

3
私はこれをグーグルで検索しました))そして、ポステルの法則に関するページには、「入力を受け取るコードは、意味が明確である限り、非準拠の入力を受け入れるべきです」とも書かれています。クライアントから不明なパラメータが送信された場合、その意味を明確にすることはできません。クライアントが非推奨のパラメーターを送信した場合、それは明らかであり、以前のように、またクライアントが期待するようには機能しません。クライアントが読み取り専用のパラメータを送信した場合、それは明らかであり、クライアントの希望どおりに書き込まれません。
ステパン

0

パブリックAPI(または他のチームが使用するAPI)を実行する場合は、@ RubberDuckが示唆したようにエラーを返すことをお勧めします。

APIがチーム内でのみ(または自分でのみ)消費される場合、余分なフィールドを無視する方が簡単な場合があります(たとえば、必要なコードが少なくて済み、実行が容易です)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.