Si bien la especificación HTTP 1.1 parece permitir cuerpos de mensaje en solicitudes DELETE , parece indicar que los servidores deben ignorarla ya que no hay una semántica definida para ella.
4.3 Cuerpo del mensaje
Un servidor DEBE leer y reenviar el cuerpo de un mensaje en cualquier solicitud; si el método de solicitud no incluye la semántica definida para un cuerpo de entidad, entonces el cuerpo del mensaje DEBE ignorarse al manejar la solicitud.
Ya revisé varias discusiones relacionadas sobre este tema en SO y más allá, como:
- ¿Se permite un cuerpo de entidad para una solicitud HTTP DELETE?
- Cargas útiles de métodos de solicitud HTTP
- HTTP GET con cuerpo de solicitud
La mayoría de las discusiones parecen coincidir en que se puede permitir proporcionar un cuerpo de mensaje en un DELETE , pero generalmente no se recomienda.
Además, he notado una tendencia en varias bibliotecas de cliente HTTP en las que parece que se registran más y más mejoras para que estas bibliotecas admitan los cuerpos de solicitud en DELETE. La mayoría de las bibliotecas parecen complacer, aunque ocasionalmente con un poco de resistencia inicial.
Mi caso de uso requiere la adición de algunos metadatos requeridos en un DELETE (por ejemplo, el "motivo" de la eliminación, junto con algunos otros metadatos necesarios para la eliminación). He considerado las siguientes opciones, ninguna de las cuales parece completamente apropiada y en línea con las especificaciones HTTP y / o las mejores prácticas de REST:
- Cuerpo del mensaje : la especificación indica que los cuerpos del mensaje en DELETE no tienen valor semántico; no es totalmente compatible con los clientes HTTP; no es una práctica estándar
- Encabezados HTTP personalizados : exigir encabezados personalizados generalmente va en contra de las prácticas estándar ; usarlos es inconsistente con el resto de mi API, ninguno de los cuales requiere encabezados personalizados; Además, no hay una buena respuesta HTTP disponible para indicar valores de encabezado personalizados incorrectos (probablemente una pregunta separada por completo)
- Encabezados HTTP estándar : ningún encabezado estándar es apropiado
- Parámetros de consulta : agregar parámetros de consulta en realidad cambia el URI de solicitud que se está eliminando; contra las prácticas estándar
- Método POST : (por ejemplo
POST /resourceToDelete { deletemetadata }
) POST no es una opción semántica para eliminar; POST en realidad representa la acción opuesta deseada (es decir, POST crea subordinados de recursos; pero necesito eliminar el recurso) - Múltiples métodos : dividir la solicitud DELETE en dos operaciones (por ejemplo, PUT delete metadata, luego DELETE) divide una operación atómica en dos, dejando potencialmente un estado inconsistente. El motivo de la eliminación (y otros metadatos relacionados) no forman parte de la representación del recurso en sí.
Mi primera preferencia probablemente sería usar el cuerpo del mensaje, después de los encabezados HTTP personalizados; sin embargo, como se indicó, existen algunas desventajas en estos enfoques.
¿Existen recomendaciones o mejores prácticas en línea con los estándares REST / HTTP para incluir tales metadatos requeridos en las solicitudes DELETE? ¿Existen otras alternativas que no he considerado?
Jersey
no permiten el cuerpo para lasdelete
solicitudes.