8

特定の値と等しくない属性でリソースをフィルタリングする、リソースコレクションのREST URLを設計するにはどうすればよいですか?

たとえば、中学2年生を取得するには、

GET /students?grade=8

中学2年生以外の生徒取得する必要がある場合、同じことを行うにはどうすればよいですか?そして、()未満、(<)より大きい>などの設計方法は?

4

3 に答える 3

8

私が考えているのは、値から区切られた引数の一部として演算子を含めることです。また、見苦しい URL エンコーディングの必要性や、パラメーター名の後の等号との混乱を避けるために、非記号演算子も定義します。あなたの例では、これは 8 年生ではない学生の場合、次のようになります。

GET /students?grade=neq|8

8 年生以上の生徒は次のようになります。

GET /students?grade=gt|8

8 年生から 10 年生までの生徒:

GET /students?grade=gte|8,lte|10

このアプローチは、各フィールドのフィルタリング方法を変更するために追加のパラメーターを追加する必要なく、他のフィルター可能なフィールドに拡張できます。

于 2013-03-13T11:51:59.997 に答える
3

gradeOperator1 つのオプションは、値をパラメーターと比較するときに使用する演算子を渡すなど、追加のクエリ パラメーターを追加すること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 が受け取る入力演算子を適切にサニタイズしてください。

于 2013-02-28T07:33:29.680 に答える