¿Están los métodos PUT, DELETE, HEAD, etc. disponibles en la mayoría de los navegadores web?
-
03-07-2019 - |
Pregunta
He visto un par de preguntas por aquí como Cómo depurar servicios RESTful, que menciona:
Desafortunadamente, ese mismo navegador no me permite probar HTTP PUT, DELETE y, hasta cierto punto, incluso HTTP POST.
También escuché que los navegadores solo admiten GET y POST, de otras fuentes como:
- http://www.packetizer.com/ws/rest.html
- http://www.mail-archive.com/jmeter-user@jakarta.apache.org/msg13518.html
- http://www.xml.com/cs/user/view/cs_msg/1098
Sin embargo, algunas pruebas rápidas en Firefox muestran que enviar PUT
y DELETE
Las solicitudes funcionan como se esperaba: el XMLHttpRequest
se completa con éxito y la solicitud aparece 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?
Solución
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 HTTP GET método. El método GET solo debe solicitar y recuperar datos y no debería tener otro efecto.
La palabra clave publicación , que se asigna al estado POST, que indica el método HTTP POST. El método POST solicita que el servidor acepta que se procesen los datos del formulario enviado, lo que puede resultar en un elemento que se agrega a una base de datos, la creación de una nueva web recurso de página, la actualización de la página existente o todas las resultados mencionados.
La palabra clave diálogo , que se asigna al diálogo de estado, lo que indica que el envío del formulario está destinado a cerrar el cuadro de diálogo en el que el formulario se encuentra, si lo hay, y de lo contrario no se envía.
El valor predeterminado no válido para estos atributos es el estado GET
I.e. Los formularios HTML solo admiten GET y POST como métodos de solicitud HTTP. Una solución 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).
Otros consejos
Los formularios HTML admiten GET y POST. (HTML5 en un momento agregó PUT / DELETE, pero se eliminaron).
XMLHttpRequest admite todos los métodos, incluido CHICKEN, aunque algunos nombres de métodos no coinciden con 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.
XMLHttpRequest
es un objeto estándar en el modelo de objetos JavaScript.
Según Wikipedia, XMLHttpRequest
apareció 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 toma el método HTTP como argumento, y se especifica que acepta cualquier método HTTP válido (consulte el elemento número 5 del enlace), incluido GET
, POST
, HEAD
, PUT
y DELETE
, como especificado por RFC 2616.
Como nota al margen IE 7–8 solo permite los siguientes métodos HTTP:"OBTENER", "POST", "HEAD", "PONER", "BORRAR", "MOVER", "PROPFIND", "PROPPATCH", "MKCOL", "COPIAR", "BLOQUEAR", "DESBLOQUEAR" y " OPCIONES".
Creo que esos comentarios se refieren específicamente a los navegadores, es decir, hacer clic en enlaces y enviar formularios, no XMLHttpRequest
. XMLHttpRequest
es solo un cliente personalizado que tú Escribió en JavaScript que utiliza el navegador como tiempo de ejecución.
ACTUALIZAR:Para aclarar, no quise decir (aunque sí escribí) que tú escribió XMLHttpRequest
;Quise decir que escribiste el código que usa XMLHttpRequest
.Los navegadores no soportan de forma nativa XMLHttpRequest
. XMLHttpRequest
proviene del tiempo de ejecución de JavaScript, que puede estar alojado en un navegador, aunque no es necesario que lo esté (consulte Rinoceronte).Por eso la gente dice que los navegadores no soportan PUT
y DELETE
—Porque en realidad es JavaScript el que los admite.
_method
solución de campo oculto
Utilizado en Rails y podría adaptarse a cualquier marco:
-
agrega un parámetro oculto
form_tag
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 HTML (por ejemplo, Rails
<form method="post"
) -
corrige el método de formulario real para POST (<=>)
-
procesa <=> en 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: https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms
SÍ , 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 admite estos métodos. Para verificar qué navegadores son compatibles con XMLHttpRequest Level 2, recomiendo CanIUse:
Solo Opera Mini carece de cajero automático de soporte (julio '15), pero Opera Mini carece de soporte para todo. :)
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.