Estoy creando un servicio RESTfull para una estructura de recursos en forma de árbol y me preguntaba cuál sería la mejor estructura de URL.
Tengo tres requisitos:
- ser capaz de obtener una colección de recursos raíz
- ser capaz de obtener un recurso individual
- ser capaz de obtener una colección de recursos secundarios
Mi pensamiento actual es:
/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents
También estaba pensando en seguir las rutas en singular / plural para denotar listas o elementos individuales, pero sé que voy a tener un recurso que es el mismo plural que singular, así que decidí no hacerlo.
¿Alguien tiene alguna idea sobre lo anterior? o tiene una forma diferente / mejor de estructurar esto?
web-services
Matt Brailsford
fuente
fuente
Respuestas:
Lo que me viene a la mente es: no permita que la API RESTful refleje la recursividad en la propia URL. Ahora que lo pienso, su recurso son solo los documentos.
Si tiene sus documentos almacenados físicamente de acuerdo con la estructura recursiva, cree una asignación a una ID única y use la ID en la URL:
Ahora, si tienes tus documentos así:
la solicitud consultaría esta url para el
/abc/asd
documentoPor lo tanto, ahora debe proporcionar a los usuarios de su API medios para atravesar su estructura con poco esfuerzo. Eso podría hacerse envolviendo su carga útil de respuesta (documento) en un objeto, que contiene información transversal adicional, como esta:
siempre que espere que los usuarios no creen demasiados documentos en un solo nivel, puede incluir una lista de niños en la respuesta. Si ese no es el caso, podría ofrecerle al usuario que recupere las identificaciones de documentos secundarios de esta manera, permitiendo, por ejemplo, paginar los resultados a través de parámetros de cadena de consulta:
Finalmente, hablando de los parámetros de la cadena de consulta, también puede proporcionar la información de ruta directamente a través de los parámetros de la cadena de consulta:
Todos los enfoques mencionados esperan que el plano
GET /rest/documents
devuelva solo documentos raíz.fuente
Algo como esto quizás:
donde {rootEntity} es el punto de partida de su colección, {leafEntity} es cualquier nodo hoja con nombre dentro de su árbol.
Puede agregar algunos parámetros a cualquiera de los anteriores para seleccionar, por ejemplo, Último o Todo o algo así.
fuente