Me preguntaba cuáles son las opiniones de las personas sobre una PUT
operación RESTful que no devuelve nada (nulo) en el cuerpo de respuesta.
Me preguntaba cuáles son las opiniones de las personas sobre una PUT
operación RESTful que no devuelve nada (nulo) en el cuerpo de respuesta.
Respuestas:
La especificación HTTP ( RFC 2616 ) tiene una serie de recomendaciones que son aplicables. Aquí está mi interpretación:
200 OK
para una PUT exitosa de una actualización de un recurso existente. No se necesita cuerpo de respuesta. (Según la Sección 9.6 , 204 No Content
es aún más apropiado).201 Created
para un PUT exitoso de un nuevo recurso, con el URI más específico para el nuevo recurso devuelto en el campo del encabezado Ubicación y cualquier otro URI y metadato relevante del recurso se hizo eco en el cuerpo de respuesta. ( RFC 2616 Sección 10.2.2 )409 Conflict
para un PUT que es correcto debido a un 3 rd modificación -party, con una lista de diferencias entre el intento de actualización y el recurso actual en el cuerpo de la respuesta. ( RFC 2616 Sección 10.4.10 )400 Bad Request
para un PUT fallido, con texto en lenguaje natural (como el inglés) en el cuerpo de la respuesta que explica por qué falló el PUT. ( RFC 2616 Sección 10.4 )No response body needed
en relación con un 200. De hecho, el cuerpo de respuesta no se menciona en absoluto en relación con un PUT. Solo diceIf an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.
A diferencia de la mayoría de las respuestas aquí, en realidad creo que PUT debería devolver el recurso actualizado (además del código HTTP, por supuesto).
La razón por la que desea devolver el recurso como respuesta para la operación PUT es porque cuando envía una representación de recursos al servidor, el servidor también puede aplicar algún procesamiento a este recurso, por lo que al cliente le gustaría saber cómo funciona este recurso parece que después de que la solicitud se completó con éxito. (de lo contrario, tendrá que emitir otra solicitud GET).
Creo que es posible que el servidor devuelva contenido en respuesta a un PUT. Si está utilizando un formato envolvente de respuesta que permite datos de carga lateral (como el formato consumido por ember-data), también puede incluir otros objetos que pueden haber sido modificados a través de activadores de bases de datos, etc. (Los datos de carga lateral son explícitamente para reducir # de solicitudes, y este parece ser un buen lugar para optimizar.)
Si solo acepto el PUT y no tengo nada que informar, uso el código de estado 204 sin cuerpo. Si tengo algo que informar, uso el código de estado 200 e incluyo un cuerpo.
La especificación HTTP / 1.1 (sección 9.6) analiza los códigos de respuesta / error apropiados. Sin embargo, no aborda el contenido de la respuesta.
¿Qué esperarías? Un simple código de respuesta HTTP (200, etc.) me parece sencillo y sin ambigüedades.
Si el backend de la API REST es una base de datos relacional SQL, entonces
Si no le importan las actualizaciones perdidas, o si desea obligar a sus clientes a realizar una OBTENCIÓN inmediatamente después de un PUT, no devuelva nada de PUT.
Código de respuesta HTTP de 201 para "Creado" junto con un encabezado "Ubicación" para señalar dónde puede encontrar el cliente el recurso recién creado.
Utilicé RESTful API en mis servicios, y aquí está mi opinión: Primero debemos llegar a una vista común: PUT
se utiliza para actualizar un recurso que no se crea ni se obtiene.
Definí recursos con: Stateless resource
y Stateful resource
:
Recursos sin estado Para estos recursos, solo devuelva el HttpCode con el cuerpo vacío, es suficiente.
Recursos con estado Por ejemplo: la versión del recurso. Para este tipo de recursos, debe proporcionar la versión cuando desee cambiarla, así que devuelva el recurso completo o devuelva la versión al cliente, de modo que el cliente no necesite enviar una solicitud de obtención después de la acción de actualización.
Pero , para un servicio o sistema, mantenerlosimple
,clearly
,easy to use and maintain
es lo más importante.
Del mismo modo que un cuerpo de Solicitud vacío cumple con el propósito original de una solicitud GET y el cuerpo de respuesta vacío cumple con el propósito original de una solicitud PUT.
parece estar bien ... aunque creo que una indicación rudimentaria de éxito / fracaso / tiempo publicado / # bytes recibidos / etc. Sería preferible.
editar: estaba pensando en la línea de integridad de datos y / o mantenimiento de registros; metadatos como un hash MD5 o una marca de tiempo para el tiempo recibido pueden ser útiles para grandes archivos de datos.
Idealmente, devolvería una respuesta de éxito / fracaso.
Hay una diferencia entre el encabezado y el cuerpo de una respuesta HTTP. PUT nunca debe devolver un cuerpo, sino que debe devolver un código de respuesta en el encabezado. Simplemente elija 200 si tuvo éxito y 4xx si no. No existe un código de retorno nulo. ¿Por qué quieres hacer esto?
200
para PUT, DELETE o cualquier otro método. ¿Me he perdido algo? ¿Como que Mozilla se convierta en el jefe de W3 y el IETF? ;) O tal vez nunca hayan oído hablar del Principio de Robustez de Postel.