¿Cómo manejar las reglas comerciales con una API REST?

7

Tengo una API REST para administrar un sistema de reservas Estoy buscando cómo manejar esta situación:

Un cliente puede reservar un horario: Se crea un recurso de TimeSlot y se vincula a un recurso de Persona. Para crear el enlace entre un lote de tiempo y una persona, el cliente REST envía una solicitud POST en el recurso TimeSlot

Pero si demasiadas personas reservaron la misma ranura (digamos que el límite es de 5 enlaces), debe ser imposible crear más asociaciones.

¿Cómo puedo manejar esta restricción comercial? ¿Puedo devolver un código de estado 404 con una respuesta JSON que detalle el error con un código de estado?

¿Es un enfoque RESTFul?

EDITAR:

Como se sugiere a continuación, utilicé el estado 409 Conflicto además de una respuesta JSON que detalla el error

EDIT 2:

Como se detalla en el @Cormac Mulhall, el 403 Forbidden es el código de estado más preciso para este caso

    
pregunta Sylvain 22.07.2014 - 11:48

3 respuestas

9

Te quiere 403 Prohibido. De las especificaciones HTTP

  

403 Prohibido: el servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO DEBE repetirse.

No debe usar 409, implica que el cliente podría resolver el conflicto, que en el caso de una reserva excesiva, el cliente no puede hacerlo ya que las reglas de conflicto son del lado del servidor.

Recuerde que, en el contexto de los códigos de estado HTTP, "conflicto" significa un conflicto en el estado del recurso (en este caso, la franja horaria del libro), , por ejemplo, espera tiempo en un formato y lo envió en el formato incorrecto [mal ejemplo, mejor sería que dos clientes actualicen un recurso al mismo tiempo y el servidor no pueda determinar qué actualización guardar, como en un sistema con versión controlada]. El recurso es un intervalo de tiempo, si cambia a un intervalo de tiempo diferente, ha creado un recurso diferente, no ha resuelto un conflicto con este recurso.

  

409 Conflicto: la solicitud no se pudo completar debido a un conflicto con el estado actual del recurso. Este código es solo permitido en   situaciones en las que se espera que el usuario pueda resolver   El conflicto y volver a enviar la solicitud.

El servidor debe devolver 403 Forbidden con una explicación de que se niega a guardar el estado porque ese intervalo de tiempo ya está lleno. Nada de lo que el cliente puede hacer para alterar el estado del recurso puede cambiar eso. El cliente no debe volver a enviar. En su lugar, deben crear una nueva ranura de tiempo (puede devolver la ranura libre más cercana como una sugerencia).

    
respondido por el Cormac Mulhall 25.08.2014 - 13:25
4

404 indica que no se encuentra un recurso. Un código de respuesta más apropiado sería un 409 con un cuerpo que contenga más detalles si la naturaleza del conflicto.

    
respondido por el Pete 22.07.2014 - 17:30
1

Atención : vea la respuesta de Cormac Mullhall

404 significa recurso no encontrado. Usarlo aquí no sería apropiado. Porque el recurso existe claramente, pero no puede ser manipulado. De acuerdo con los Consejos rápidos ( enlace ) 409 Conflicto sería una buena manera de proceder. Por supuesto, puede devolver 200 con mensaje de error en el cuerpo. El cliente sigue siendo responsable de leer las respuestas y actuar sobre ellas.

    
respondido por el Roman Mik 22.07.2014 - 17:24

Lea otras preguntas en las etiquetas