2012-01-10 8 views
7

パーソナルプログラミングプロジェクトとして、私は大学のコースカタログを掻き集め、データをREST APIとして提供しています。私は正常にすべてのデータを掻き集めてデータベースに格納し、現在はAPIに取り組んでいます。複数のフィルタを持つREST APIを最適に設計するにはどうすればよいですか?

コースは、多くの基準に基づいてフィルタリングすることができます:インストラクター、大学、クレジット、時間、日など

は、このような状況でAPIを提供するための最良の方法は何ですか?

オプション1

私はすべての順列のURLを持っている必要があり、このような

example.com/api/byinstructor/<instructorcode> 
example.come/api/bycollege/<collegecode> 
example.com/api/bycollegeandinstructor/<collegecode>/<instructorcode> 
...and so on 

など、多数のURLを提供します。これは、私とAPIの両方の消費者にとって非常に面倒で、非常に不安です。

example.com/api/byinstructor/<instructorcode> 
example.come/api/bycollege/<collegecode> 

をそして消費者がbycollegeandinstructorを望んでいるならば、彼は彼の側でフィルタリングを行います。2

オプションのみのような主要なオプションのためのAPIを提供しています。

オプション3

ユーザーが私にJSON文字列を渡し、そして私が代わりにJSON文字列の仮定

example.com/api/getcourses/<jsonstring> 

jsonstring = 
{ 
    instructor:<instructorcode>, 
    college:<collegecode>, 
    ...and so on 
} 

私はフィルタリング基準を取得するためにそれを使用、私も必要になる場合がありPOSTアレイですが、データを取得しているので消費者にとっては直感的ではないようです。

これは私が気づいていない別の方法ですか?最適なオプションの3番目のオプションであれば、可変数の値を持つ可能性があるJSOn文字列に基づいてSQLクエリを準備するための短い要約を提供できますか?あなたはURIになりつのリソース、コースのセットを、持っているようJFからの回答に拡大すること

答えて

13

、それが聞こえる:

/courses 

は、そのリソースをフィルタリングが通常のクエリを使用して達成されますその単一のリソースをフィルタリングするためのパラメータ、例えば:

/courses?college=123&instructor=321 

これにより、あなたは資源の増殖を作成し、すべての可能な順列の問題を避けます。

基本的に:1つのリソースがあり、必要に応じてフィルタリングできます。

+0

Thanls。私はyhourの答え – xbonez

+6

を読むまでリソースの面で考えていませんでした技術的に、それらはまだ別のリソースです。あなたは本当に順列問題をこのように避けません。実際には、college = 123&instructor = 321にinstructor = 321&college = 123と同じ応答を返すことで、これらの問題を少し増やします。この爆発のため、明示的に構成するように構成しないかぎり、多くのキャッシュは問合せパラメータを持つレスポンスをキャッシュしません。 このような理由から、一般的なパターンを特定できる場合は、オプション2をお勧めします。 – fumanchu

+0

@fumanchuこれは、クエリパラメータを使用したリクエストに対する応答を無視したキャッシュについては興味深いことですが、私はそれを認識していませんでした。ありがとう。 – Pete

5
GET example.com/courses?college=<collegecode>&instructor=<instructorcode> 
+0

消費者は、必要な数のGETパラメータを渡すことができますか? – xbonez

+0

@xbonez:はい。制約がない場合は、アプリケーションに適したデフォルト値を使用できます。たとえば、ユーザーがわかっている場合はフィルタリングをパーソナライズできます。 – jfs

+0

が完璧です。ありがとうございます – xbonez

関連する問題