2012-01-10 16 views
7

Como proyecto de programación personal, estoy trabajando en el raspado de mi catálogo de cursos de la Universidad y proporcionando los datos como una API REST. Recogí todos los datos con éxito y los almacené en una base de datos, y ahora estoy trabajando en la API.¿Cuál es la mejor manera de diseñar una API REST con múltiples filtros?

Los cursos se pueden filtrar en función de muchos criterios: instructor, universidad, créditos, hora, día, etc.

¿Cuál es la mejor manera de proporcionar una API en esta situación?

Opción 1

proporcionan numerosas direcciones URL como

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

que iba a necesitar para tener una URL para todas las permutaciones. Esto parece muy engorroso, tanto para mí como para los consumidores API, y muy poco seco.

Opción 2

proporcionar solamente APIs para las principales opciones como:

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

Y si el consumidor quiere bycollegeandinstructor, lo hace el filtrado en su extremo.

Opción 3

El usuario pasa una cadena JSON a mí, y yo la use para obtener los criterios de filtrado

example.com/api/getcourses/<jsonstring> 

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

supongo que en lugar de la cadena JSON, podría también requerir una POST array, pero parece inutitivo para el consumidor ya que él está OBTENIENDO datos.

¿O hay otra forma de hacer esto de la que no tengo conocimiento? Si es la tercera opción la mejor opción, ¿podría proporcionar un breve resumen para preparar una consulta SQL sobre la base de una cadena JSOn que pueda tener una cantidad variable de valores?

Respuesta

13

Para ampliar la respuesta de JF, suena como que tiene un recurso, el conjunto de cursos, lo que sería en el URI:

/courses 

Filtrado de ese recurso por lo general se lleva a cabo mediante consulta parámetros para filtrar ese recurso único, por ejemplo:

/courses?college=123&instructor=321 

de esta manera, se evita el problema con todas las permutaciones posibles de crear una proliferación de recursos.

Fundamentalmente: hay un recurso, que se puede filtrar según sea necesario.

+0

Thanls. No estaba pensando en términos de recursos hasta que leí su respuesta – xbonez

+6

Técnicamente, esos son recursos distintos.Realmente no evita los problemas de permutación de esta manera; de hecho, aumentas esos problemas un poco al permitir que la universidad = 123 y el instructor = 321 devuelvan la misma respuesta que instructor = 321 y universidad = 123. Debido a esta explosión, muchas memorias caché no almacenan en caché una respuesta que tiene parámetros de consulta a menos que los configure explícitamente para hacerlo. Por esa razón, generalmente recomiendo la opción 2 si puede identificar algunos patrones comunes en las solicitudes que hacen las personas. – fumanchu

+0

@fumanchu Eso es interesante sobre los cachés que ignoran las respuestas a las solicitudes con parámetros de consulta, no estaba al tanto de eso. Gracias. – Pete

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

y se permite que el consumidor pueda pasar tantos o tan pocos parámetros GET como ellos quieren? – xbonez

+0

@xbonez: sí. En ausencia de una restricción, puede usar valores predeterminados apropiados para su aplicación, por ejemplo, personalizar el filtrado si el usuario es conocido. – jfs

+0

perfecto. gracias – xbonez

Cuestiones relacionadas