2011-03-25 13 views
11

Estoy conectando una interfaz REST a una aplicación existente y tengo curiosidad acerca de cuál es la solución más adecuada para tratar con recursos que devolverían una cantidad exorbitante de datos si fueran para ser recuperadoQué hacer con los enormes recursos en API REST

La aplicación es un sistema de hoja de tiempo existente y uno de los recursos es un conjunto de "ranuras de tiempo" de un usuario. Un ejemplo URI de estos recursos es:

/users/44/timeslots/ 

He leído un montón de preguntas que se refieren a la forma de proporcionar el filtrado de este recurso para recuperar un subconjunto y ya tengo una solución para eso.

Quiero saber cómo (o si) debo manejar la situación de que emitir un GET en el URI anterior devolvería megabytes de datos de decenas o cientos de miles de filas y tomaría una buena cantidad de recursos de servidor para realmente responden en primer lugar.

  • ¿Existe una respuesta HTTP utilizada por la convención en estas situaciones?
    me encontré con código HTTP 413, que se refiere a una entidad de solicitud que es demasiado grande, pero no una que sea adecuada para cuando la entidad de respuesta sería demasiado grande
  • ¿Hay una convención alternativa para limitar la respuesta o diciendo el cliente que esta es una solicitud tonta?
  • ¿Debo simplemente dejar que el servidor cumpla con esta solicitud masiva?

EDIT: Para que quede claro, no tengo el filtrado y la división del recurso implementado y he considerado la paginación en otros recursos de recogida grandes. Quiero responder de forma adecuada a las solicitudes que no tienen sentido (y obviamente han sido solicitadas por un cliente que está construyendo un URI).

+1

¿De verdad es un problema devolver tantos datos en dicha solicitud? ¿O simplemente está tratando de protegerse contra una recuperación involuntaria que da como resultado un desperdicio de recursos del servidor y ancho de banda? –

+1

Si la solicitud es tonta, no implemente un controlador para ese recurso y devuelva un 404 si alguien construye erróneamente ese URI. ... y luego ganarles en la construcción de URLs :-) –

+0

@ jeff-hall No hay problema con la devolución de tantos datos, es simplemente una protección contra la recuperación no intencionada como mencionaste. –

Respuesta

12

Usted es libre de diseñar sus URI como quiera codificar cualquier concepto .

Por lo tanto, dependiendo de sus usuarios (humanos/máquinas) puede usarlo como una división en un nivel conceptual basado en su espacio o dominio problemático. Como usted ha mencionado es probable que tenga algo como esto:

/users/44/timeslots/afternoon 
/users/44/timeslots/offshift 
/users/44/timeslots/hours/1 
/users/44/timeslots/hours/1 
/users/44/timeslots/UTC1624 

vez también puede limitar por las ideas/conceptos como arriba. Filtra más agregando consultas/usuarios/44/timeslots? Día = días de la semana & dow = mon

Haciendo uso de conceptos y filtros como este limitará naturalmente el tamaño de respuesta. Pero tienes que intentar diseñar tu API sin entrar en esa situación. Si su cliente se porta mal, dele un 400 Bad Request.Si algo sale mal en su lado del servidor use un código 5XX.

Hacer uso de una de las herramientas de REST - hipermedia y vincula (Véase también HATEOAS) Enlace a la siguiente parte de su hipermedia, hacen uso de "trozo" como conceptos comprensibles por su dominio (páginas, tiempo- máquinas tragamonedas). No es necesario descargar megabytes que también no es bueno para el almacenamiento en memoria caché que afecta la escalabilidad/velocidad.

+1

HATEOS .. lol. ¡Gracias @Darrel Miller por corregir el error tipográfico! –

+0

+1: para la sugerencia de paginación – jfs

+0

@Derick Debatí realmente cambiarlo a Restricción de hipertexto. El consenso general parece ser que el acrónimo HATEOAS no está ayudando a nadie y el término preferido es "restricción de hipertexto". –

0

Esto puede ser una respuesta demasiado débil, pero así es como mi equipo lo ha manejado. Se requieren grandes recursos como ese para tener la información de filtrado adicional provista. Si la información de filtrado no está ahí para mantener el tamaño dentro de un rango específico, entonces devolvemos un Error interno (500) con un mensaje apropiado para indicar que no se utilizó correctamente la API RESTful.

Espero que esto ayude.

+6

HTTP 500 generalmente no es apropiado para un código de error intencional. 500 debe usarse cuando el software ha fallado inesperadamente o ha cumplido una condición de excepción. En su lugar, es apropiado devolver HTTP 400 Bad Request. Vea este StackOverflow relacionado [publicación] (http://stackoverflow.com/questions/3290182/rest-http-status-codes/3290198#3290198). –

3

intervalos de tiempo es un recurso colección, ¿por qué no simplemente permitir la paginación en ese recurso

ver aquí: Pagination in a REST web application

llamar a conseguir en la colección sin información de la página simplemente devuelve la primera página (con un valor predeterminado tamaño de página)

¿Debo simplemente dejar que el servidor cumpla con esta solicitud masiva? Creo que no debería hacerlo, pero eso depende de usted, ¿puede el servidor manejar grandes volúmenes? ¿Lo encuentras un uso válido?

+0

Aha! Usecase es la palabra mágica. La pregunta también es válida para el escenario de paginación, ¿es un uso de valor? Si no, ¿por qué molestarse en perder el tiempo implementándolo? Lo que se remonta a la pregunta original, ¿por qué estamos debatiendo la implementación de un punto final que no parece ser un caso de uso y podría causar problemas si alguien lo utiliza? –

+0

Correcto, no hay ningún Uso para este recurso que se solicita directamente sin un filtro. Simplemente quiero devolver una respuesta adecuada a esa solicitud no válida. –

+0

@Alex 404 parece ser el más lógico para mí. Devolver un 400 indicaría al cliente que la solicitud estaba mal formada de alguna manera y que si hacen la solicitud "correctamente" devolvería un valor. –