Así que nada nuevo aquí, solo estoy tratando de obtener alguna aclaración y parece que no puedo encontrar ninguna en otras publicaciones.
Estoy creando un nuevo recurso con calma, digamos:
/books (POST)
con un cuerpo:
{
title: 'The Lion, the Witch and the Wardrobe',
author: 'C. S. Lewis'
}
Sé que debería devolver un 201 (Creado) con un encabezado de Ubicación del nuevo recurso:
Location: /books/12345
La pregunta que parece que no puedo responder por mí mismo es qué debería devolver el servidor en el cuerpo.
A menudo he hecho este tipo de respuesta:
{
id: 12345,
title: 'The Lion, the Witch and the Wardrobe',
author: 'C. S. Lewis'
}
He hecho esto por un par de razones:
- He escrito api para marcos frontales como angularjs. En mi caso particular, estoy usando recursos angulares y a menudo necesito solo la identificación del recurso para ubicarlo. Si no devolvía la identificación en el cuerpo de la respuesta, tendría que analizarla fuera del encabezado de Ubicación.
- En una OBTENCIÓN de todos los libros, generalmente devuelvo el objeto completo, no solo la identificación. En este sentido, mi código de cliente no tiene que diferenciar de dónde obtener la identificación (encabezado o cuerpo de ubicación).
Ahora sé que estoy realmente en el área gris aquí, pero la mayoría de la gente dice que devolver todo el recurso es una 'mala' práctica. Pero, ¿qué pasa si el servidor cambia / agrega información al recurso? Definitivamente agrega la identificación, pero también podría agregar otras cosas como una marca de tiempo. En el caso de que no devuelva todo el recurso, ¿es realmente mejor hacer una POST, devolver la identificación y luego hacer que el cliente realice una OBTENCIÓN para obtener el nuevo recurso?
fuente
Respuestas:
Devolver el objeto completo en una actualización no parecería muy relevante, pero difícilmente puedo ver por qué devolver el objeto completo cuando se crea sería una mala práctica en un caso de uso normal. Esto sería útil al menos para obtener la identificación fácilmente y para obtener las marcas de tiempo cuando sea relevante. Este es realmente el comportamiento predeterminado que se obtiene al andamiaje con Rails.
Realmente no veo ninguna ventaja en devolver solo la identificación y hacer una solicitud GET después, para obtener los datos que podría haber obtenido con su POST inicial.
De todos modos, siempre que su API sea consistente, creo que debe elegir el patrón que mejor se adapte a sus necesidades. No hay ninguna forma correcta de cómo construir una API REST, imo.
fuente
La devolución del nuevo objeto se ajusta al principio REST de "Interfaz uniforme: manipulación de recursos a través de representaciones". El objeto completo es la representación del nuevo estado del objeto que se creó.
Aquí hay una referencia realmente excelente para el diseño de API: Mejores prácticas para diseñar una API RESTful pragmática
Incluye una respuesta a su pregunta aquí: las actualizaciones y la creación deben devolver una representación de recursos
Dice:
Me parece muy pragmático y encaja con el principio REST que mencioné anteriormente.
fuente