2013-02-28 2 views
6

リソースコレクションのREST urlを設計する方法です。例えばリソースコレクションのREST url。与えられた値と等しくない属性でリソースをフィルタリングします。

、中学2年生の学生を得るために、私たちは中学2年生で生徒ないを取得する必要がある場合は、同じことを行う方法

GET /students?grade=8 

を使うのか?どのように(<)、(>)などよりも小さく設計するのですか?

+0

チェックこのリンクが役に立つ場合 http://stackoverflow.com/questions/4614255/rest-url-design-for-greater-than-less-than-operations – rvini

+0

しかし、それは改ページについての詳細を語ります –

答えて

3

のような追加のクエリパラメータを追加すると、値をgradeパラメータと比較するときに使用する演算子を渡すことができます。例えば、

GET /students?grade=8&gradeOperator=!%3D 

!%3D!=URL-encoded形ですので、あなたのREST APIは、オペレータをエンコード-解除とgrade != 8としてこれを解釈します。

もう1つの方法は、HTTP要求本体で値と演算子を渡すことです。このような何か潜在的に(例として、JSONで提供体で)動作します:

いいかもしれない
GET /students 
Content-Type: application/json 

{ "grade": {"value": 8, "operator": "!=" } } 

あなたはgradeOperatorに単語「グレード」を繰り返す必要がないため、オペレータが簡単にネストされています値はgradeのJSONオブジェクト内にあります。いずれかの解決策では

は、あなたが潜在的に含む、事業者の任意の数を定義でき <>>=<=などだけでDBクエリで使用される場合は特に、適切に、あなたのAPIが受け取る任意の入力演算子をサニタイズするようにしてください SQL injectionのような攻撃を避けてください。

7

私が考えているのは、値から区切られた引数の一部として演算子を含めることです。また、パラメータ名の後に等号をつけたり、混乱させたりすることを避けるために、シンボリックでない演算子を定義します。グレード> 8の学生は以下のようになり

GET /students?grade=neq|8 

::(包括的)等級8と10の間

GET /students?grade=gt|8 

学生:

あなたの例では、これは等級8の学生ではないため、このようなものになるだろう
GET /students?grade=gte|8,lte|10 

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