I metodi PUT, DELETE, HEAD, ecc. Sono disponibili nella maggior parte dei browser Web?


608

Ho visto un paio di domande qui come How to debug RESTful services , che menziona:

Sfortunatamente quello stesso browser non mi permetterà di testare HTTP PUT, DELETE e fino a un certo punto anche HTTP POST.

Ho anche sentito che i browser supportano solo GET e POST, da alcune altre fonti come:

Tuttavia, alcuni rapidi test in Firefox mostrano che l'invio PUTe le DELETErichieste funzionano come previsto: il XMLHttpRequestcompletamento è corretto e la richiesta viene visualizzata nei registri del server con il metodo giusto. C'è qualche aspetto in questo che mi manca, come la compatibilità tra browser o limitazioni non ovvie?


1
Non è solo il client di cui devi preoccuparti, molti framework lato server supportano solo GET e POST.
derby,

7
John, per quale motivo non vuoi il tag REST?
John Saunders,

11
Sebbene le persone che leggono questo articolo stiano probabilmente indagando sulle API RESTful.
Djjeck,


No, tutti i browser non supportano i metodi PUT / DELETE e inoltre non tutte le tecnologie lato server non supportano PUT / DELETE. Solo il browser supportato da HTML 5 supporta PUT / DELETE.
Jani Devang,

Risposte:


463

No. Le specifiche HTML 5 menzionano:

Gli attributi del contenuto del metodo e del formmethod sono attributi enumerati con le seguenti parole chiave e stati:

La parola chiave ottiene , mappando allo stato GET, indicando il metodo GET HTTP. Il metodo GET dovrebbe solo richiedere e recuperare dati e non dovrebbe avere altri effetti.

La parola chiave post , mappando allo stato POST, indicando il metodo POST HTTP. Il metodo POST richiede che il server accetti i dati del modulo inviato da elaborare, il che può comportare l'aggiunta di un elemento a un database, la creazione di una nuova risorsa della pagina Web, l'aggiornamento della pagina esistente o tutti i risultati citati .

La finestra di dialogo della parola chiave , mappata alla finestra di dialogo dello stato, che indica che l'invio del modulo ha lo scopo di chiudere la finestra di dialogo in cui il modulo si trova, se presente, e altrimenti non inviare.

Il valore predefinito non valido per questi attributi è lo stato GET

Cioè i moduli HTML supportano GET e POST solo come metodi di richiesta HTTP. Per ovviare a questo problema, eseguire il tunneling di altri metodi tramite POST utilizzando un campo modulo nascosto che viene letto dal server e la richiesta inviata di conseguenza.

Tuttavia, GET , POST , PUT e DELETE sono supportati dalle implementazioni di XMLHttpRequest (ovvero chiamate AJAX) in tutti i principali browser Web (IE, Firefox, Safari, Chrome, Opera).


170
No, intendo sicuramente HTML (sto parlando delle funzionalità dei moduli HTML, anche se potrebbe non essere chiaro dal testo - lo modificherò)
Matthew Murdoch,

6
@Matthew: significa che se utilizzo IE6 o IE7, con il seguente: - <form .. method = "PUT"> ... </form> non funzionerà perché PUT non è valido per HTML 4?
Pure.Krome,

6
@ Pure.Krome (solo 14 mesi dopo) No, non puoi fare <form method = "put"> o <form method = "delete"> nelle specifiche HTML 4.01. Solo GET e POST sono supportati da IE8, Chrome3 o FF3.5.
Jarrett Meyer,

23
@porneL @Alan HTML5 li ha aggiunti e quindi li ha rimossi. Attualmente sono ammessi solo GET e POST. goo.gl/8EuZk
Adam Lassek,

13
@porneL HTML5 li ha aggiunti e quindi rimossi e ora il bug viene riaperto. È interessante notare che ho visto alcuni documenti che li hanno ancora lì dentro. Ecco il bug se vuoi seguire a casa: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch,

79

I moduli HTML supportano GET e POST. (HTML5 a un certo punto ha aggiunto PUT / DELETE, ma quelli sono stati eliminati.)

XMLHttpRequest supporta tutti i metodi, incluso CHICKEN, anche se alcuni nomi di metodo vengono confrontati con maiuscole e minuscole (i metodi fanno distinzione tra maiuscole e minuscole per HTTP) e alcuni nomi di metodi non sono affatto supportati per motivi di sicurezza (ad esempio CONNECT).

I browser stanno lentamente convergendo sulle regole specificate da XMLHttpRequest, ma come ha sottolineato l'altro commento ci sono ancora alcune differenze.


5
L'ultima bozza HTML5 sembra aver abbandonato il supporto PUT e DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov

3
È stato proposto un progetto per recuperarli: amundsen.com/examples/put-delete-forms
Joost Baaij,

26
POLLO? L'uccello? Suppongo che intendi CHECKIN. È uno scambio di vocali divertente.
JayC,

52
No, intendevo POLLO, illustrando che può essere quello che vuoi. Sono d'accordo sul fatto che lo scambio di vocali sia divertente anche se :-)
Anne

6
Per quelli tanto sconcertati quanto lo ero con questo business di POLLO .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n

43

XMLHttpRequest è un oggetto standard nel modello a oggetti JavaScript.

Secondo Wikipedia, è XMLHttpRequestapparso per la prima volta in Internet Explorer 5 come oggetto ActiveX, ma da allora è diventato uno standard ed è stato incluso per l'uso in JavaScript nella famiglia Mozilla dal 1.0, Apple Safari 1.2, Opera 7.60-p1 e IE 7.0 .

Il open()metodo in oggetto assume il metodo HTTP come argomento - e viene specificato come prendere qualsiasi metodo HTTP valido (vedere il numero articolo 5 del collegamento) - compreso GET, POST, HEAD, PUTe DELETE, come specificato da RFC 2616 .

Come nota a margine IE 7–8 consente solo i seguenti metodi HTTP: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "COPIA", "BLOCCO", "SBLOCCO" e "OPZIONI" .


7
Speravo di vedere alcuni documenti per ulteriori letture, non dico che non ti credo. I link su Wikipedia sono piuttosto belli in realtà. Grazie
naugtur

19

_method soluzione al campo nascosto

Utilizzato in Rails e potrebbe essere adattato a qualsiasi framework:

  • aggiungi un _methodparametro nascosto a qualsiasi modulo che non sia GET o POST:

    <input type="hidden" name="_method" value="DELETE">

    Questo può essere fatto automaticamente nei framework tramite il metodo helper di creazione HTML (ad es. Rails form_tag)

  • correggere il metodo del modulo effettivo su POST ( <form method="post")

  • si elabora _methodsul server e fa esattamente come se quel metodo fosse stato inviato anziché il POST effettivo

Razionale / storia del perché non è possibile: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Santilli, ciao amico, è da tanto tempo che non offri questa soluzione e, dato che sono un principiante nello sviluppo web, ho una domanda a cui spero rispondi. Quindi, hai detto che "elabora _method sul server e fa esattamente come se quel metodo fosse stato inviato al posto del POST effettivo" significava che se il metodo nascosto con PUT (o DELETE) fosse messo in vista, significherebbe effettivamente PUT (o ELIMINA) richiesta vero? se sì, allora perché usare il metodo POST all'inizio e quindi usare PUT nascosto o CANC. Qual è la connessione tra POST e PUT (o DELETE) :)
Mirich,

1
@Mirich il modulo supporta solo POST. Quindi inviamo POST con dati extra, cosa che il server conosce significa: ah, dovrei trattarlo come un PUT.
Ciro Santilli 24 冠状 病 六四 事件 法轮功

Grazie Ciro per la tua attenzione e risposta, quindi posso considerare questo scenario come questo: POST è una cosa universale che contiene POST, PUT, PATCH e DELETE effettivi al suo interno e se usi POST all'inizio senza nascosto, significherebbe reale INVIARE. Ma se usi POST con nascosto (PUT o DELETE) allora fai sapere al server che vuoi usare PUT o DELETE che sono dentro POST come i suoi figli dentro Conosco un'analogia un po 'strana ma è corretto? :)
Mirich,

1
@Mirich yup, penso che tu abbia avuto l'idea.
Ciro Santilli 24 冠状 病 六四 事件 法轮功

scusate Ciro solo l'ultima cosa, mi chiedo perché PUT e DELETE siano stati rimossi da HTML5 poiché non sarebbe meglio se poteste semplicemente usare PUT o DELETE all'inizio del tag del modulo e non usare nascosto. Per favore, puoi spiegare brevemente e chiaramente qual è stata la vera ragione della rimozione di PUT e DELETE. Grazie in anticipo :)
Mirich,

15

Credo che quei commenti si riferiscano specificamente ai browser, ovvero, facendo clic sui collegamenti e inviando moduli, non XMLHttpRequest. XMLHttpRequestè solo un client personalizzato che hai scritto in JavaScript che utilizza il browser come runtime.

AGGIORNAMENTO: Per chiarire, non intendevo (anche se ho scritto) che hai scritto XMLHttpRequest; Intendevo dire che hai scritto il codice che usa XMLHttpRequest. I browser non supportano nativamente XMLHttpRequest. XMLHttpRequestproviene dal runtime JavaScript, che può essere ospitato da un browser, sebbene non sia necessario (vedi Rhino ). Ecco perché la gente dice che i browser non supportano PUTe DELETEperché in realtà è JavaScript che li supporta.


XMLHttpRequest è un oggetto standard nel modello a oggetti JavaScript.
Jacob Krall,

9
@Jacob Vero, ma browser diversi hanno motori JavaScript diversi. Sapere quali supportano PUT è ancora utile.
senfo,

1
it's actually JavaScript that is supporting them. Non proprio vero XMLHttpRequestè un "oggetto host", nel senso che è un oggetto che espone la funzionalità dall'host al codice Javascript. Non fa parte di JS stesso.
Stijn de Witt,

9

, PUT, ELIMINA, TESTA ecc. I metodi HTTP sono disponibili in tutti i browser moderni.

Per essere conformi a XMLHttpRequest, i browser di livello 2 devono supportare questi metodi. Per verificare quali browser supportano XMLHttpRequest livello 2, consiglio CanIUse:

http://caniuse.com/#feat=xhr2

Solo Opera Mini non ha supporto atm (luglio '15), ma Opera Mini non ha supporto per tutto. :)


7

Solo per aggiungere - Safari 2 e precedenti sicuramente non supportavano PUT e DELETE. Ho l'impressione 3, ma non ce l'ho più in giro per testarlo. Safari 4 supporta sicuramente PUT e DELETE.


5
Qualcuno può confermare quale versione di Safari ha ottenuto il supporto per PUT e DELETE?
mjs,

1
Qualcuno può approfondire se ORA tutti i browser supportano PUT & DELETE - e all'incirca da quanto tempo è disponibile. Prendendo in considerazione l'esempio "POLLO", ciò significa che dipende interamente dal server interpretare quale metodo viene utilizzato E che JavaScript non limita il tipo di metodo ...?
Cody,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.