2012-01-10 22 views
7

Jako osobisty projekt programistyczny pracuję nad skrobaniem katalogu kursu uniwersyteckiego i udostępnieniem danych jako interfejsu API REST. Udało mi się zebrać wszystkie dane i zapisać je w bazie danych, a teraz pracuję nad interfejsem API.Jak najlepiej zaprojektować interfejs REST API z wieloma filtrami?

kursów mogą być filtrowane na podstawie wielu kryteriów: instruktor, uczelni, kredytów, czas, dzień itd

Jaki jest najlepszy sposób, aby zapewnić API w tej sytuacji?

Wariant 1

podać wiele adresów, takich jak

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

chciałbym mieć adres URL dla wszystkich permutacji. Wydaje się to bardzo uciążliwe, zarówno dla mnie, jak i dla użytkowników API, i bardzo nie-SUCHEGO.

Opcja 2

jedynie zapewnić API dla głównych opcji, takich jak:

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

A jeśli konsument chce bycollegeandinstructor, robi filtrowanie na jego końcu.

Wariant 3

Użytkownik przechodzi ciąg JSON do mnie, a ja używać, aby uzyskać kryteria filtrowania

example.com/api/getcourses/<jsonstring> 

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

Przypuszczam zamiast łańcuch JSON, mogę również wymagać Tablica POST, ale wydaje się być niezrozumiała dla konsumenta, ponieważ pobiera dane.

Czy istnieje inny sposób robienia tego, czego nie jestem świadomy? Jeśli jest to trzecia opcja, która jest najlepszą opcją, czy możesz podać krótkie streszczenie najlepiej przygotować zapytanie SQL na podstawie łańcucha JSOn, który może mieć zmienną liczbę wartości?

Odpowiedz

13

Aby rozwinąć na odpowiedź od JF, to brzmi jak masz jeden zasób, zestaw kursów, które byłyby w URI:

/courses 

Filtrowanie tego zasobu jest zwykle realizowane przy użyciu kwerendy parametry filtrować że pojedynczy zasób, np:

/courses?college=123&instructor=321 

w ten sposób można uniknąć problemu z wszystkich możliwych permutacji tworząc proliferację zasobów.

Zasadniczo: istnieje jeden zasób, który można filtrować w razie potrzeby.

+0

Thanls. Nie myślałem o zasobach, póki nie przeczytałem odpowiedzi na godzinę – xbonez

+6

Technicznie, są to wciąż odrębne zasoby.Tak naprawdę nie unikasz problemów związanych z permutacją; w rzeczywistości, nieznacznie zwiększysz te kwestie, pozwalając uczelni = 123 i instruktorowi = 321 na zwrócenie tej samej odpowiedzi, co instruktor = 321 i college = 123. Z powodu tej eksplozji wiele pamięci podręcznych nie buforuje odpowiedzi, która ma parametry zapytania, chyba że jawnie je skonfigurujesz. Z tego powodu generalnie zalecam opcję 2, jeśli potrafisz zidentyfikować typowe wzorce we wnioskach, które ludzie robią. – fumanchu

+0

@fumanchu Interesujące jest to, że pamięci podręczne ignorują odpowiedzi na żądania z parametrami zapytania, nie byłem tego świadomy. Dzięki. – Pete

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

a konsument może przekazywać tyle lub tylko kilka parametrów GET, ile chce? – xbonez

+0

@xbonez: tak. W przypadku braku ograniczenia można użyć wartości domyślnych odpowiednich dla aplikacji, np. Spersonalizować filtrowanie, jeśli użytkownik jest znany. – jfs

+0

doskonały. dziękuję – xbonez

Powiązane problemy