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
)
Añadido una adición a la pregunta. – dafmetal