2010-05-12 17 views
6

Estoy diseñando una API REST donde algunos recursos se pueden filtrar a través de parámetros de consulta. En algunos casos, estos valores de filtro serían recursos de la misma API REST. Esto crea URI largos y bastante ilegibles. Si bien esto no es un problema en sí mismo, ya que los URI deben crearse y manipularse mediante programación, es una depuración dolorosa. Estaba pensando en permitir accesos directos a los URI utilizados como valores de filtro y me pregunto si esto está permitido de acuerdo con la arquitectura REST y si hay algunas prácticas recomendadas.Mejores prácticas sobre el uso de URI como valor de parámetro en llamadas REST

Por ejemplo:

tengo un recurso que me pone las clases de Java. Entonces la petición siguiente me daría todas las clases de Java:

GET http://example.org/api/v1/class 

Supongamos que quiero todas las subclases de la clase Collection Java, entonces se utiliza la siguiente solicitud:

GET http://example.org/api/v1/class?has-supertype=http://example.org/api/v1/class/collection 

Esa solicitud me volvería Vector , ArrayList y todas las demás subclases de la clase Collection de Java.

Ese URI es bastante largo. Ya pude acortarlo al permitir hs como un alias para has-supertype. Esto me daría:

Otra manera de permitir que los URI más cortos serían para permitir que los alias para los prefijos de URI. Por ejemplo, podría definir class como un alias para el prefijo URI http://example.org/api/v1/class/. Lo que me daría la siguiente posibilidad:

GET http://example.org/api/v1/class?hs=class:collection 

Otra posibilidad sería eliminar el alias de clase por completo y siempre prefijar el valor del parámetro con http://example.org/api/v1/class/ ya que esta es la única cosa que apoyar. Esto convertiría a la solicitud de todos los subtipos de Collection en:

GET http://example.org/api/v1/class?hs=collection 

hacer estas simplificaciones "" de la URI de solicitud original aún se ajustan a los principios de una arquitectura REST? ¿O simplemente me salí de las profundidades?

ADDENDUM: Puede haber más de un filtro en el URI a la vez. Ya sea como parámetros diferentes, o como una lista de valores para un solo parámetro. Piense en las líneas de "Todas las clases que implementan Interfaz X y/o Interfaz Y" o "Todas las clases que implementan Interfaz X y están en paquete ABC" (donde los paquetes también serían direccionables a un URI como http://example.org/api/v1/packages/a/b/c)

+0

Añadido una adición a la pregunta. – dafmetal

Respuesta

3

me gustaría ir a hacer:

GET http://example.org/api/v1/class/java.util.Collection/subclasses 

devolverá una lista de enlaces a otras entradas de la API REST, uno para cada subclase directa. También me gustaría hacer que la información disponible como parte del descriptor devuelto por: (. Eso también incluir un enlace a la consulta específica precedente)

GET http://example.org/api/v1/class/java.util.Collection 

+0

+1: evitar cadenas de consulta. –

+0

Agregué un apéndice a la pregunta. @ S.Lott ¿Podría explicarnos su razonamiento para evitar las cadenas de consulta? Tenía la impresión de que esto estaba bien para las API REST. – dafmetal

+0

@dafmetal: Hasta donde puedo decir, las interfaces RESTful realmente no se adaptan a cosas tan complejas si pueden ayudarlo. Donde no pueden, van con un asunto horrible 'foo? Query = bar' que devuelve una lista de enlaces a los recursos que satisfacen la consulta. –

Cuestiones relacionadas