Pregunta ¿Se permite el cuerpo de una entidad para una solicitud HTTP DELETE?


Al emitir una solicitud HTTP DELETE, el URI de la solicitud debe identificar completamente el recurso para eliminar. Sin embargo, ¿está permitido agregar metadatos adicionales como parte del cuerpo de la entidad de la solicitud?


514
2017-11-18 18:14


origen


Respuestas:


La especificación no lo prohíbe ni desalienta explícitamente, así que tendería a decir que está permitido.

Microsoft lo ve de la misma manera (puedo oír murmullos en la audiencia), dicen en el artículo de MSDN sobre el ELIMINAR el método del marco de servicios de datos ADO.NET:

Si una solicitud DELETE incluye un cuerpo de entidad, el cuerpo se ignora [...]

Además esto es lo que RFC2616 (HTTP 1.1) tiene que decir con respecto a las solicitudes:

  • un entidad-cuerpo solo está presente cuando Cuerpo del mensaje está presente (sección 7.2)
  • la presencia de un Cuerpo del mensaje se señala mediante la inclusión de un Content-Length o Transfer-Encoding encabezado (sección 4.3)
  • un Cuerpo del mensaje no debe incluirse cuando la especificación del método de solicitud no permite enviar un entidad-cuerpo (sección 4.3)
  • un entidad-cuerpo está explícitamente prohibido en las solicitudes TRACE solamente, todos los demás tipos de solicitud no están restringidos (específicamente en las secciones 9 y 9.8)

Para las respuestas, esto ha sido definido:

  • si una Cuerpo del mensaje está incluido depende de ambos métodos de solicitud y estado de respuesta (sección 4.3)
  • un Cuerpo del mensaje está explícitamente prohibido en las respuestas a las solicitudes HEAD (sección 9 y 9.4 específicamente)
  • un Cuerpo del mensaje está explícitamente prohibido en 1xx (informativo), 204 (sin contenido) y 304 (no modificado) respuestas (sección 4.3)
  • todas las otras respuestas incluyen un cuerpo de mensaje, aunque puede ser de longitud cero (sección 4.3)

419
2017-11-18 18:36



La última actualización de la especificación HTTP 1.1 (RFC 7231) explícitamente permite un cuerpo de entidad en una solicitud DELETE:

Una carga dentro de un mensaje de solicitud DELETE no tiene semántica definida; enviar un cuerpo de carga en una solicitud DELETE puede causar que algunas implementaciones existentes rechacen la solicitud.


117
2018-04-04 16:49



Algunas versiones de Tomcat y Jetty parecen ignorar un cuerpo de entidad si está presente. Lo cual puede ser una molestia si tiene la intención de recibirlo.


48
2018-01-15 19:56



Una razón para usar el cuerpo en una solicitud de eliminación es para un control de concurrencia optimista.

Lees la versión 1 de un registro.

GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }

Su colega lee la versión 1 del registro.

GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }

Su colega cambia el registro y actualiza la base de datos, que actualiza la versión a 2:

PUT /some-resource/1 { id:1, status:"important", version:1 }
200 OK { id:1, status:"important", version:2 }

Intenta eliminar el registro:

DELETE /some-resource/1 { id:1, version:1 }
409 Conflict

Debería obtener una excepción de bloqueo optimista. Vuelva a leer el registro, vea que es importante y quizás no lo elimine.

Otra razón para usarlo es eliminar múltiples registros a la vez (por ejemplo, una cuadrícula con casillas de selección de filas).

DELETE /messages
[{id:1, version:2},
{id:99, version:3}]
204 No Content

Tenga en cuenta que cada mensaje tiene su propia versión. Tal vez pueda especificar múltiples versiones usando múltiples encabezados, pero por George, esto es más simple y mucho más conveniente.

Esto funciona en Tomcat (7.0.52) y Spring MVC (4.05), posiblemente también en versiones anteriores:

@RestController
public class TestController {

    @RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
    SomeBean echoDelete(@RequestBody SomeBean someBean) {
        return someBean;
    }
}

42
2017-08-09 06:24



Me parece que RFC 2616 no especifica esto

De la sección 4.3:

La presencia de un cuerpo de mensaje en una solicitud es señalada por el   inclusión de un campo de encabezado Content-Length o Transfer-Encoding en   los encabezados de mensaje de la solicitud. Un mensaje-cuerpo NO DEBE incluirse en   una solicitud si la especificación del método de solicitud (sección 5.1.1)   no permite el envío de un cuerpo de entidad en las solicitudes. Un servidor DEBERÍA   leer y reenviar un cuerpo de mensaje en cualquier solicitud; si el método de solicitud   no incluye la semántica definida para un cuerpo de entidad, entonces el   message-body DEBE ser ignorado al manejar la solicitud.

Y la sección 9.7:

El método DELETE solicita que el servidor de origen elimine el recurso   identificado por el Request-URI. Este método PUEDE ser anulado por humanos   intervención (u otro medio) en el servidor de origen. El cliente no puede   garantizarse que la operación se haya llevado a cabo, incluso si el   El código de estado devuelto por el servidor de origen indica que la acción   ha sido completado exitosamente Sin embargo, el servidor NO DEBERÍA   indicar éxito a menos que, en el momento en que se da la respuesta,   tiene la intención de eliminar el recurso o moverlo a un lugar inaccesible   ubicación.

Una respuesta exitosa DEBERÍA ser 200 (OK) si la respuesta incluye un   entidad que describe el estado, 202 (Aceptado) si la acción no tiene   aún se ha promulgado, o 204 (Sin contenido) si la acción se ha promulgado   pero la respuesta no incluye una entidad.

Si la solicitud pasa a través de un caché y el URI de solicitud identifica   una o más entidades actualmente en caché, esas entradas DEBERÍAN ser   tratado como rancio. Las respuestas a este método no son cacheables.c

Por lo tanto, no está explícitamente permitido o no permitido, y existe la posibilidad de que un proxy en el camino elimine el cuerpo del mensaje (aunque DEBERÍA leerlo y reenviarlo).


27
2017-11-18 18:37



Solo un aviso, si proporciona un cuerpo en su solicitud DELETE y está utilizando un equilibrador de carga de Google Cloud HTTPS, rechazará su solicitud con un error de 400. Estaba golpeando mi cabeza contra una pared y descubrí que Google, por la razón que sea, cree que una solicitud DELETE con un cuerpo es una solicitud mal formada.


11
2018-05-25 23:46



Parece que ElasticSearch usa esto: https://www.elastic.co/guide/en/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api

Lo que significa que Netty admite esto.

Como se menciona en los comentarios, puede que ya no sea así


7
2018-05-27 14:59