Anche se la specifica HTTP 1.1 sembra consentire il corpo dei messaggi sulle richieste DELETE , sembra indicare che i server dovrebbero ignorarla poiché non ci sono semantiche definite per esso.
4.3 Corpo del messaggio
Un server DOVREBBE leggere e inoltrare il corpo del messaggio su qualsiasi richiesta; se il metodo di richiesta non include la semantica definita per un corpo di entità, il corpo del messaggio DOVREBBE essere ignorato durante la gestione della richiesta.
Ho già esaminato diverse discussioni correlate su questo argomento su SO e oltre, come ad esempio:
- È consentito il corpo di un'entità per una richiesta HTTP DELETE?
- Payload dei metodi di richiesta HTTP
- HTTP GET con corpo della richiesta
La maggior parte delle discussioni sembra concordare sul fatto che fornire un corpo del messaggio su un DELETE può essere consentito , ma generalmente non è raccomandato.
Inoltre, ho notato una tendenza in varie librerie client HTTP in cui sembrano essere registrati sempre più miglioramenti per queste librerie per supportare i corpi delle richieste su DELETE. La maggior parte delle biblioteche sembra accontentarsi, anche se occasionalmente con un po 'di resistenza iniziale.
Il mio caso d'uso richiede l'aggiunta di alcuni metadati obbligatori su un DELETE (ad esempio il "motivo" per l'eliminazione, insieme ad alcuni altri metadati richiesti per l'eliminazione). Ho considerato le seguenti opzioni, nessuna delle quali sembra completamente appropriata e in linea con le specifiche HTTP e / o le migliori pratiche REST:
- Corpo del messaggio - La specifica indica che il corpo del messaggio su DELETE non ha valore semantico; non completamente supportato dai client HTTP; non una pratica standard
- Intestazioni HTTP personalizzate - La richiesta di intestazioni personalizzate è generalmente contro le pratiche standard ; il loro utilizzo non è coerente con il resto della mia API, nessuna delle quali richiede intestazioni personalizzate; inoltre, nessuna buona risposta HTTP disponibile per indicare valori di intestazione personalizzati errati (probabilmente una domanda a parte)
- Intestazioni HTTP standard : nessuna intestazione standard è appropriata
- Parametri di query : l'aggiunta di parametri di query modifica effettivamente l'URI della richiesta da eliminare; contro le pratiche standard
- Metodo POST - (ad esempio
POST /resourceToDelete { deletemetadata }
) POST non è un'opzione semantica per l'eliminazione; POST rappresenta effettivamente l' azione opposta desiderata (ovvero POST crea risorse subordinate; ma ho bisogno di eliminare la risorsa) - Metodi multipli - La divisione della richiesta DELETE in due operazioni (ad es. PUT delete metadata, then DELETE) divide un'operazione atomica in due, lasciando potenzialmente uno stato incoerente. Il motivo dell'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, secondo alle intestazioni HTTP personalizzate; tuttavia, come indicato, ci sono alcuni aspetti negativi di questi approcci.
Esistono consigli o best practice in linea con gli standard REST / HTTP per l'inclusione di tali metadati obbligatori nelle richieste DELETE? Ci sono altre alternative che non ho considerato?
Jersey
non consentono il corpo per ledelete
richieste.