2012-01-10 19 views
7

Come progetto di programmazione personale, sto lavorando per raschiare il catalogo dei corsi del mio Ateneo e fornire i dati come API REST. Ho eseguito correttamente il raschiamento di tutti i dati e l'ho archiviato in un database e ora sto lavorando sull'API.Il modo migliore per progettare un'API REST con più filtri?

I corsi possono essere filtrati in base a numerosi criteri: istruttore, università, crediti, ora, giorno ecc

Qual è il modo migliore per fornire un'API in questa situazione?

Opzione 1

fornire numerosi gli URL come

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

avrei bisogno di un URL per tutte le permutazioni. Questo sembra molto complicato, sia per me che per i consumatori delle API, e molto poco umido.

Opzione 2

forniscono solo le API per le principali opzioni come:

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

E se il consumatore vuole bycollegeandinstructor, lo fa il filtraggio sulla sua fine.

Opzione 3

L'utente passa una stringa JSON per me, e io uso che per ottenere i criteri di filtro

example.com/api/getcourses/<jsonstring> 

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

Suppongo che invece della stringa JSON, potrei anche richiedere una Array POST, ma ciò sembra non categorico per il consumatore dal momento che sta recuperando i dati.

Oppure c'è un altro modo per farlo non ne sono a conoscenza? Se è la terza opzione l'opzione migliore, potresti fornire un breve sommario per preparare una query SQL sulla base di una stringa JSOn che potrebbe avere un numero variabile di valori?

risposta

13

Per espandere sulla risposta da JF, suona come avete una risorsa, l'insieme dei corsi, che sarebbe al URI:

/courses 

Filtraggio quella risorsa è compiuta solitamente tramite interrogazione parametri di filtro che singola risorsa, ad esempio:

/courses?college=123&instructor=321 

in questo modo, si evita il problema con tutte le possibili permutazioni creando una proliferazione di risorse.

Fondamentalmente: c'è una risorsa, che può essere filtrata se necessario.

+0

Grazie. Non stavo pensando in termini di risorse finché non ho letto la tua risposta – xbonez

+6

Tecnicamente, quelle sono ancora risorse distinte.In questo modo non eviti davvero i problemi di permutazione; in effetti, aumenti leggermente tali problemi consentendo a college = 123 e instructor = 321 di restituire la stessa risposta di istruttore = 321 e college = 123. A causa di questa esplosione, molte cache non memorizzeranno nella cache una risposta che ha parametri di query a meno che non le si configuri esplicitamente per farlo. Per questo motivo, generalmente raccomando l'opzione 2 se è possibile identificare alcuni modelli comuni nelle richieste che le persone fanno. – fumanchu

+0

@fumanchu Questo è interessante per le cache che ignorano le risposte alle richieste con parametri di query, non ne ero a conoscenza. Grazie. – Pete

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

e il consumatore è autorizzato a trasmettere quanti più parametri GET desiderati? – xbonez

+0

@xbonez: sì. In assenza di un vincolo, è possibile utilizzare i valori predefiniti appropriati per la propria applicazione, ad esempio, personalizzare il filtro se l'utente è noto. – jfs

+0

perfetto. grazie – xbonez

Problemi correlati