Mentre il consente di inviare corpi di messaggi sulle richieste DELETE, sembra indicare che i server devono ignorarlo poiché non esiste una semantica definita per esso.Alternative RESTful per ELIMINARE l'ente di richiesta
4,3 Corpo del messaggio
un server dovrebbe leggere e inoltrare un messaggio-corpo su qualsiasi richiesta; se il metodo di richiesta non include la semantica definita per un corpo dell'entità, , il corpo del messaggio DOVREBBE essere ignorato durante la gestione della richiesta.
Ho già recensito diverse discussioni correlate su questo argomento su SO e al di là, come ad esempio:
- Is an entity body allowed for an HTTP DELETE request?
- Payloads of HTTP Request Methods
- HTTP GET with request body
maggior parte delle discussioni sembrano concordo che fornire un corpo del messaggio su DELETE può essere consentito, ma in genere non è raccomandato.
Inoltre, ho notato una tendenza in varie librerie client HTTP in cui sembra che vengano sempre più registrati miglioramenti per queste librerie per supportare i corpi delle richieste su DELETE. La maggior parte delle biblioteche sembra obbligare, anche se occasionalmente con un po 'di resistenza iniziale.
Il mio caso d'uso richiede l'aggiunta di alcuni metadati richiesti su un DELETE (ad esempio il "motivo" per l'eliminazione, insieme ad altri metadati richiesti per l'eliminazione). Ho considerato le seguenti opzioni, nessuna delle quali sembrano completamente adeguato e in linea con le specifiche HTTP e/o di riposo le migliori pratiche:
- corpo del messaggio - La specifica indica che il corpo dei messaggi su DELETE non hanno alcun valore semantico; non completamente supportato dai client HTTP; non pratica standard
- Intestazioni HTTP personalizzate - La richiesta di intestazioni personalizzate è generalmente against standard practices; utilizzarli è incoerente con il resto della mia API, nessuno dei quali richiede intestazioni personalizzate; inoltre, nessuna buona risposta HTTP a disposizione per indicare i valori di intestazione male personalizzati (probabilmente una questione a parte tutto)
- standard HTTP intestazioni - Nessuna testata standard sono appropriati
- parametri di query - Aggiunta di query params in realtà cambia la richiesta- URI cancellato; against standard practices
- Metodo POST - (ad esempio
POST /resourceToDelete { deletemetadata }
) Il POST non è un'opzione semantica per l'eliminazione; POST rappresenta in realtà il opposta azione desiderata (ad esempio POST crea subordinati di risorse, ma ho bisogno di eliminare la risorsa) - multipli Metodi - Splitting la richiesta di eliminazione in due operazioni (ad esempio PUT eliminare i metadati, quindi eliminare) Split un operazione atomica in due, potenzialmente lasciando uno stato incoerente.Il motivo di eliminazione (e altri metadati correlati) non fanno parte della rappresentazione della risorsa stessa.
La mia prima preferenza sarebbe probabilmente quella di utilizzare il corpo del messaggio, in secondo luogo alle intestazioni HTTP personalizzate; tuttavia, come indicato, ci sono alcuni aspetti negativi di questi approcci.
Esistono raccomandazioni o best practice in linea con gli standard REST/HTTP per includere tali metadati richiesti sulle richieste DELETE? Ci sono altre alternative che non ho considerato?
Alcune implementazioni come 'Jersey' non consentono il corpo per richieste' delete'. – basiljames
Sembra davvero che non ci sia una buona risposta a questo problema. – niico