2013-05-29 4 views
29

Ultimamente vedo molti framework che hanno deciso di "falsificare" le richieste PUT e DELETE. Come Ruby on Rails. Sembrano aspettare che i browser li raggiungano. Stanno aspettando invano?Perché i browser non supportano le richieste PUT e DELETE e quando lo faranno?

È prevista l'implementazione anche in qualsiasi luogo?

+1

Quali azioni a livello di browser richiederebbero la semantica 'PUT' e' DELETE'? È già possibile generare azioni HTTP 'PUT' e' DELETE' in modo programmatico. È solo che non riesco a immaginare come si potrebbero esporre questi a un utente in un browser (cosa farebbe? PUT? Quando si trascina un file nel browser?) – Gian

+0

Sono supportati nelle richieste HTML5 e Ajax. – n1xx1

+0

@ N1xx1 quindi in html5 potrei fare

? Dolce. Vedrò questo. – pixelearth

risposta

53

Browser supportano PUT e DELETE, ma è HTML che non lo fa.

Ad esempio, un browser avvierà una richiesta PUT tramite Javascript (AJAX), ma non tramite l'invio di HTML <form>.

Questo perché HTML 4.01 e l'ultima specifica HTML 5.0 di W3C affermano entrambi che gli unici metodi HTTP che gli elementi form devono consentire sono GET e POST.

Durante lo sviluppo di HTML 5 si è discusso molto e ad un certo punto sono stati aggiunti all'HTML 5, per poi essere nuovamente rimossi. Il motivo per cui i metodi aggiuntivi sono stati rimossi dalle specifiche HTML 5 è dovuto al fatto che i browser HTML a 4 livelli non potrebbero mai supportarli (non facenti parte di HTML nel momento in cui sono stati creati); e non c'è modo di consentire loro di farlo senza uno spessore JavaScript; quindi, puoi anche usare AJAX.

pagine web che cercano di utilizzare moduli con method="PUT" o method="DELETE" sarebbero ricadere il metodo predefinito, GET per tutti i browser attuali. Ciò interrompe i tentativi delle applicazioni Web di utilizzare metodi appropriati nei moduli HTML per l'azione desiderata e finisce per dare un risultato peggiore: GET viene utilizzato per eliminare le cose! (Ciao cingolato. Oh, urla! Ci va il mio database)

Cambiare il metodo predefinito per HTML <form> elementi al POST aiuterebbero (IMO il default dovrebbe sono sempre stati POST, sin da quando moasic * forme debuttato nel 1993), ma cambiare l'impostazione predefinita richiederebbe almeno un decennio per percolare attraverso la base installata. Quindi in due parole: "perché legacy". :-(

Per supportare i browser attuali, gli autori dovranno fingere con un override consiglio autori usano il noto a, b_method argomento includendo <input type=hidden name=_method value=DELETE> nella loro HTML;. Commutare il metodo di modulo per POST (dal momento che la richiesta non è sicura), quindi aggiungere il riconoscimento di _method sul lato server, che dovrebbe quindi fare tutto il necessario per mutare la richiesta e inoltrarla come se fosse una richiesta DELETE reale.

Nota anche che, dal Web i browser sono l'ultimo client HATEOAS, hanno bisogno di avere un ne w stato da trasferire a loro per richieste DELETE. le API esistenti spesso restituiscono 204 No Content per tali richieste. Dovresti invece rispedire una risposta ipermediale con link in modo che l'utente possa progredire nello stato del browser.

Si veda anche la risposta a queste domande simili/identici:


* Mosiac, creato da Marc A ndreessen, ha anche introdotto l'errore composto del tag <img src=…> - avrebbe dovuto essere <image source=…>fallback</image>.