特定の値と等しくない属性でリソースをフィルタリングする、リソースコレクションのREST URLを設計するにはどうすればよいですか?
たとえば、中学2年生を取得するには、
GET /students?grade=8
中学2年生以外の生徒を取得する必要がある場合、同じことを行うにはどうすればよいですか?そして、()未満、(<
)より大きい>
などの設計方法は?
私が考えているのは、値から区切られた引数の一部として演算子を含めることです。また、見苦しい URL エンコーディングの必要性や、パラメーター名の後の等号との混乱を避けるために、非記号演算子も定義します。あなたの例では、これは 8 年生ではない学生の場合、次のようになります。
GET /students?grade=neq|8
8 年生以上の生徒は次のようになります。
GET /students?grade=gt|8
8 年生から 10 年生までの生徒:
GET /students?grade=gte|8,lte|10
このアプローチは、各フィールドのフィルタリング方法を変更するために追加のパラメーターを追加する必要なく、他のフィルター可能なフィールドに拡張できます。
gradeOperator
1 つのオプションは、値をパラメーターと比較するときに使用する演算子を渡すなど、追加のクエリ パラメーターを追加することgrade
です。例えば、
GET /students?grade=8&gradeOperator=!%3D
!%3D
は のURL エンコード形式で!=
あるため、REST API は演算子を逆エンコードし、これを として解釈しgrade != 8
ます。
もう 1 つの方法は、HTTP 要求本文で値と演算子を渡すことです。次のようなものがうまくいく可能性があります (例として JSON で提供される本体を使用):
GET /students
Content-Type: application/json
{ "grade": {"value": 8, "operator": "!=" } }
で「グレード」という単語を繰り返す必要がないため、これは便利ですgradeOperator
。演算子は、の値として JSON オブジェクト内にネストされているだけですgrade
。
<
どちらのソリューションでも、>
、>=
、 、 など、任意の数の演算子を定義できる可能性があります。特に DB クエリで使用する場合は、 SQL インジェクション攻撃<=
などを回避するために、API が受け取る入力演算子を適切にサニタイズしてください。