¿Están disponibles los métodos PUT, DELETE, HEAD, etc. en la mayoría de los navegadores web?

608

He visto un par de preguntas por aquí, como Cómo depurar servicios RESTful , que menciona:

Desafortunadamente, ese mismo navegador no me permitirá probar HTTP PUT, DELETE y, hasta cierto punto, incluso HTTP POST.

También he oído que los navegadores solo admiten GET y POST, de algunas otras fuentes como:

Sin embargo, algunas pruebas rápidas en Firefox muestran que el envío PUTy las DELETEsolicitudes funcionan como se esperaba: se XMLHttpRequestcompleta con éxito y la solicitud se muestra en los registros del servidor con el método correcto. ¿Hay algún aspecto que me falta, como la compatibilidad entre navegadores o limitaciones no obvias?

John Millikin
fuente
1
No solo tiene que preocuparse por el cliente, sino que muchos marcos del lado del servidor solo admiten GET y POST.
derby el
77
John, ¿alguna razón por la que no quieres la etiqueta REST?
John Saunders
11
Aunque es probable que las personas que lean esto estén investigando las API RESTful.
djjeck
No, todos los navegadores no son compatibles con los métodos PUT / DELETE, y tampoco todas las tecnologías del lado del servidor no son compatibles con PUT / DELETE. Solo el navegador compatible con HTML 5 admite PUT / DELETE.
Jani Devang

Respuestas:

463

No. La especificación HTML 5 menciona:

Los atributos de contenido de método y método de método son atributos enumerados con las siguientes palabras clave y estados:

La palabra clave get , que se asigna al estado GET, que indica el método HTTP GET. El método GET solo debe solicitar y recuperar datos y no debe tener otro efecto.

La publicación de palabras clave , que se asigna al estado POST, que indica el método HTTP POST. El método POST solicita que el servidor acepte que se procesen los datos del formulario enviado, lo que puede dar como resultado que se agregue un elemento a una base de datos, la creación de un nuevo recurso de página web, la actualización de la página existente o todos los resultados mencionados .

El cuadro de diálogo de palabras clave , que se asigna al cuadro de diálogo de estado, indica que el envío del formulario tiene la intención de cerrar el cuadro de diálogo en el que se encuentra el formulario, si lo hay, y de lo contrario no se envía.

El valor predeterminado no válido para estos atributos es el estado GET

Es decir, los formularios HTML solo admiten GET y POST como métodos de solicitud HTTP. Una solución alternativa para esto es hacer un túnel de otros métodos a través de POST mediante el uso de un campo de formulario oculto que es leído por el servidor y la solicitud se despacha en consecuencia.

Sin embargo, GET , POST , PUT y DELETE son compatibles con las implementaciones de XMLHttpRequest (es decir, llamadas AJAX) en todos los principales navegadores web (IE, Firefox, Safari, Chrome, Opera).

Matthew Murdoch
fuente
170
No, definitivamente me refiero a HTML (estoy hablando de las capacidades de los formularios HTML, aunque eso puede no estar claro en el texto, lo editaré)
Matthew Murdoch
66
@Matthew: ¿significa esto que si uso IE6 o IE7, con lo siguiente: - <form .. method = "PUT"> ... </form> no funcionará porque PUT no es válido para HTML 4?
Pure.Krome
66
@ Pure.Krome (solo 14 meses después) No, no puede hacer <form method = "put"> o <form method = "delete"> bajo la especificación HTML 4.01. Solo GET y POST son compatibles con IE8, Chrome3 o FF3.5.
Jarrett Meyer
23
@porneL @Alan HTML5 los agregó y luego los eliminó. Actualmente solo se permiten GET y POST. goo.gl/8EuZk
Adam Lassek
13
@porneL HTML5 los agregó y luego los eliminó, y ahora el error se volvió a abrir. Curiosamente, he visto alguna documentación que todavía los tiene allí. Aquí está el error si quieres seguirlo en casa: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch
79

Los formularios HTML admiten GET y POST. (HTML5 en un punto agregó PUT / DELETE, pero se eliminaron).

XMLHttpRequest admite todos los métodos, incluido CHICKEN, aunque algunos nombres de métodos no coinciden entre mayúsculas y minúsculas (los métodos distinguen entre mayúsculas y minúsculas por HTTP) y algunos nombres de métodos no son compatibles en absoluto por razones de seguridad (por ejemplo, CONNECT).

Los navegadores convergen lentamente en las reglas especificadas por XMLHttpRequest, pero como el otro comentario señaló, todavía hay algunas diferencias.

Anne
fuente
55
El último borrador HTML5 parece haber dejado de admitir PUT y DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov
3
Se ha propuesto un borrador para recuperarlos: amundsen.com/examples/put-delete-forms
Joost Baaij
26
¿POLLO? ¿El pájaro? Supongo que te refieres a CHECKIN. Eso es un intercambio de vocales divertido.
JayC
52
No, quise decir POLLO, ilustrarlo puede ser lo que quieras. Sin embargo, estuve de acuerdo en que el intercambio de vocales era divertido :-)
Anne
66
Para aquellos tan desconcertados como yo con este negocio de POLLO .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n
43

XMLHttpRequest es un objeto estándar en el modelo de objetos JavaScript.

Según Wikipedia, XMLHttpRequestapareció por primera vez en Internet Explorer 5 como un objeto ActiveX, pero desde entonces se ha convertido en un estándar y se ha incluido para su uso en JavaScript en la familia Mozilla desde 1.0, Apple Safari 1.2, Opera 7.60-p1 e IE 7.0 .

El open()método en el objeto realiza el método HTTP como un argumento - y se especifica como de tomar cualquier método HTTP válida (véase el número de artículo 5 del enlace) - incluyendo GET, POST, HEAD, PUTy DELETE, como se especifica en RFC 2616 .

Como nota al margen, IE 7–8 solo permite los siguientes métodos HTTP: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "COPIAR", "BLOQUEAR", "DESBLOQUEAR" y "OPCIONES" .

Vihung
fuente
77
Esperaba ver algunos documentos para leer más, no digo que no te creo. Los enlaces en wikipedia son bastante buenos en realidad. Gracias
naugtur
19

_method solución de campo oculto

Utilizado en Rails y podría adaptarse a cualquier marco:

  • agregue un _methodparámetro oculto a cualquier formulario que no sea GET o POST:

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

    Esto se puede hacer automáticamente en marcos a través del método auxiliar de creación de HTML (por ejemplo, Rails form_tag)

  • arregle el método de formulario real a POST ( <form method="post")

  • procesa _methoden el servidor y hace exactamente como si ese método hubiera sido enviado en lugar de la POST real

Justificación / historia de por qué no es posible: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
Santilli, hola amigo, ha pasado mucho tiempo desde que ofreciste esta solución, y como soy un principiante en desarrollo web, tengo una pregunta que espero que respondas. Entonces, dijiste que "procesa _method en el servidor y haces exactamente como si ese método hubiera sido enviado en lugar de la POST real", quisiste decir que si el método oculto con PUT (o DELETE) se pone en la vista, en realidad significaría PUT (o ELIMINAR) solicitud correcta? en caso afirmativo, ¿por qué usar el método POST al principio y luego usar PUT oculto o DELETE? ¿Cuál es la conexión entre POST y PUT (o eliminar) :)
Mirich
1
@Mirich el formulario solo admite POST. Entonces enviamos POST con datos adicionales, que el servidor sabe que significa: ah, debería tratar esto como un PUT.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Gracias Ciro por su atención y respuesta, así que puedo considerar este escenario así: POST es una cosa universal que contiene POST, PUT, PATCH y DELETE real dentro de sí mismo y si usa POST al principio sin oculto, entonces significaría real ENVIAR. Pero si usa POST con oculto (PUT o DELETE), entonces le informa al servidor que desea usar PUT o DELETE que están dentro de POST como sus hijos dentro. Conozco una analogía un poco extraña, pero ¿es correcto? :)
Mirich
1
@Mirich, sí, creo que has entendido la idea.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
lo siento, Ciro, por último, me pregunto por qué PUT y DELETE se eliminaron de HTML5, ya que no sería mejor si pudieras usar PUT o DELETE al comienzo de la etiqueta del formulario y no usar oculto. ¿Puede explicar brevemente y con claridad cuál fue el motivo real de la eliminación de PUT y DELETE? Gracias de antemano :)
Mirich
15

Creo que esos comentarios se refieren específicamente a los navegadores, es decir, hacer clic en los enlaces y enviar formularios, no XMLHttpRequest. XMLHttpRequestes sólo un cliente personalizado que se ha escrito en JavaScript que utiliza el navegador como un tiempo de ejecución.

ACTUALIZACIÓN: Para aclarar, no quise decir (aunque escribí) que usted escribió XMLHttpRequest; Quise decir que escribiste el código que usa XMLHttpRequest. Los navegadores no son compatibles de forma nativa XMLHttpRequest. XMLHttpRequestproviene del tiempo de ejecución de JavaScript, que puede ser alojado por un navegador, aunque no es obligatorio (ver Rhino ). Es por eso que la gente dice que los navegadores no son compatibles PUTy, DELETEporque en realidad es JavaScript el que los admite.

Hank Gay
fuente
XMLHttpRequest es un objeto estándar en el modelo de objetos JavaScript.
Jacob Krall
99
@Jacob True, pero diferentes navegadores tienen diferentes motores de JavaScript. Saber cuáles son compatibles con PUT sigue siendo útil.
senfo
1
it's actually JavaScript that is supporting them. No es realmente cierto. XMLHttpRequestes un 'host-objeto', lo que significa que es un objeto que expone la funcionalidad del host al código Javascript. No es parte de JS en sí.
Stijn de Witt
9

YES , PUT, DELETE, HEAD, etc. Los métodos HTTP están disponibles en todos los navegadores modernos.

Para cumplir con XMLHttpRequest Level 2, los navegadores deben admitir estos métodos. Para verificar qué navegadores son compatibles con XMLHttpRequest Level 2, recomiendo CanIUse:

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

Solo Opera Mini carece de cajero automático de soporte (juli '15), pero Opera Mini carece de soporte para todo. :)

Stijn de Witt
fuente
7

Solo para agregar: Safari 2 y versiones anteriores definitivamente no admitían PUT y DELETE. Me da la impresión de que 3 sí, pero ya no lo tengo para probar. Safari 4 definitivamente admite PUT y DELETE.

jharlap
fuente
55
¿Alguien puede confirmar qué versión de Safari obtuvo soporte para PUT y DELETE?
mjs
1
¿Puede alguien explicar si todos los navegadores AHORA admiten PUT & DELETE, y aproximadamente cuánto tiempo ha estado disponible? Tomando nota del ejemplo de "POLLO", ¿significa esto que depende totalmente del servidor interpretar qué método se utiliza Y que JavaScript no restringe el tipo de método ...?
Cody