web-dev-qa-db-ja.com

REST APIラッパーは、リクエストを行う前に入力を検証する必要がありますか?

サーバーがJSONフィールドを列挙された値のセットに制限するとします。

例えばa POSTへのリクエスト/userは、「男性」、「女性」、または「n/a」のみであるgenderというフィールドを持つオブジェクトを想定しています。

ラッパーライブラリは、リクエストを行う前にフィールドが正しく設定されていることを確認する必要がありますか?

4

(REST APIを暗黙的に使用しているように)ネットワーク化されたリソースを処理している場合、ユーザーの観点からは、ユーザーエクスペリエンスへのネットワークラウンドトリップのオーバーヘッドを節約できます。

さらに、場合によっては、APIがリクエストの数に制限されたり、ボリュームに基づいて課金されたりします。どちらの場合も、送信前に事前検証を行うことは非常に理にかなっています。

したがって、一般的には、そうだと思います。APIが何を期待するかわかっている場合は、送信する前に検証してください。

6
Paul

IMOこれは主に1つの詳細に依存します:ラッパーをホストしていますか、それとも単なるクライアントライブラリですか?

どちらの場合も、検証を行わない場合(ラップされたAPIに対して明らかに、そうでない場合は入力をサニタイズする必要があります!)、それはあなた次第と思われます。このサービスにアクセスする便利な方法を思い付くことができます。しかし、あまりメリットはありません。特に、追加しすぎないようにしてください。ただし、公式のドキュメントではなくドキュメントを読む必要があるため、学習曲線を延長してください。将来のバージョンとの互換性について考える必要があります。ラッピングするAPIなど.

別のクライアントをラップするクライアントを作成している場合は、基本的なチェックを簡単に行うことができますが、基本的な実装に頼って、ものを処理する最良の方法を知ることができます。ホストされたラッパーを作成している場合は、おそらくそれらのチェックを整えておく必要があります。オフィシャルへの単純なプロキシとして機能する代わりに、透過的に互換性を提供できます(別名:ブリッジ/互換レイヤー)。この場合、あなたの小切手を設置します。

ターゲットAPIが実際にスキーマ(JSON-API、WSDL、XSL、JsonSchema、Swagger/OpenAPIなど)を使用している場合、余分な労力をかけずにdynamic検証を取得できるため、物事は便利になります。解析と検証を処理できるライブラリはたくさんあるので、それほど多くのことをする必要はないかもしれません。 [〜#〜] but [〜#〜]ラップしているAPIが十分に文書化されておらず、有益なエラーコードが提供されていない場合は絶対に必要です(「400-不正なリクエスト-予期しないことが発生しました」)

3

疑わしいときは、Webでどのように行うかを思い出してください

ラッパーライブラリは、リクエストを行う前にフィールドが正しく設定されていることを確認する必要がありますか?

これのWebアナログはhtmlフォームで、application/x-www-form-urlencodedデータをポストします。フォーム自体の表現には、パラメーター名とリストの両方を提供する入力コントロールの説明が含まれます期待値。

次に、Webブラウザーは、許可された値の範囲を明確に示す視覚要素を持つUIを生成し、人間のオペレーターが行った選択から適切な要求本文を構築します。

技術的には、選択肢の範囲を表現に含める必要はありません。許容値の範囲を説明するメディアタイプ。メディアタイプの定義を変更するためのサポートを設計することは、長期的に見れば報われると思います。

もちろん、すべてのユーザーエージェントが表現内に記述された範囲を適用するわけではありません。たとえば、curlは、独自の応答を作成しようとしても、スペルミスを防止できません。

ラッパーライブラリがプリミティブを使用したリクエストの記述をサポートする義務はありません。性別の値タイプを導入すると、ライブラリの採用が増加したり、ライブラリの使用経験が向上すると思われる場合は、必ずそうする必要があります。トレードオフ-幸せな道は使いやすくなり、Edgeケースは難しくなります。

1
VoiceOfUnreason

はい。理想的には、コンパイル時の検証です。したがって、誤った型で関数を呼び出すコードを書くことさえできません。

0
Ewan