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

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

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

También escuché que los navegadores solo admiten GET y POST, de otras fonts 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 el envío de solicitudes PUT y DELETE funciona como se esperaba: XMLHttpRequest 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 las limitaciones no obvias?

Los formularios HTML (hasta HTML versión 4 y XHTML 1) 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 utilizando un campo de formulario oculto que el servidor lee y la solicitud se envía 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).

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 se comparan 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 señaló el otro comentario, aún existen algunas diferencias.

XMLHttpRequest es un objeto estándar en el modelo de objetos de 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 método open() en el objeto toma el método HTTP como un argumento, y se especifica que toma cualquier método HTTP válido (vea el número de artículo 5 del enlace), incluyendo GET , POST , HEAD , PUT y 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” , “COPIA”, “BLOQUEO”, “DESBLOQUEO” y “OPCIONES” .

Creo que esos comentarios se refieren específicamente a los navegadores, es decir, al hacer clic en enlaces y enviar formularios, no en XMLHttpRequest . XMLHttpRequest es solo un cliente personalizado que escribió en JavaScript que usa el navegador como 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 nativamente con XMLHttpRequest . XMLHttpRequest proviene del tiempo de ejecución de JavaScript, que puede estar alojado en un navegador, aunque no es obligatorio (consulte Rhino ). Es por eso que la gente dice que los navegadores no admiten PUT y DELETE porque en realidad es JavaScript el que los respalda.

_method solución de campo oculto

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

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

      

    Esto se puede hacer automáticamente en frameworks a través del método HTML creation helper (ej. Rails form_tag )

  • arregla el método de formulario real a POST (

    )

  • _method en el servidor y hacer exactamente como si ese método hubiera sido enviado en lugar del 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

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 tengo más para probar. Safari 4 definitivamente admite PUT y DELETE.

, PUT, BORRAR, CABEZA etc. Los métodos HTTP están disponibles en todos los navegadores modernos.

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

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

Solo a Opera Mini le falta soporte ATM (juli ’15), pero Opera Mini carece de soporte para todo. 🙂