2008-10-03 29 views
561

que he visto un par de preguntas por aquí como How to debug RESTful services, que menciona:¿Los métodos PUT, DELETE, HEAD, etc. están disponibles en la mayoría de los navegadores web?

Por desgracia, eso mismo navegador no me permite poner a prueba HTTP PUT, DELETE, y hasta cierto punto incluso HTTP POST.

También he oído que los navegadores soportar sólo GET y POST, de algunas otras fuentes como:

Sin embargo, unos pocos pruebas rápidas en Firefox muestran que enviando PUT y DELETE reque pts funciona como se esperaba: el XMLHttpRequest finaliza correctamente 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?

+7

John, ¿alguna razón por la que no desea la etiqueta REST? –

+1

No es solo el cliente del que debe preocuparse, muchos frameworks del lado del servidor solo admiten GET y POST. – derby

+11

Aunque es probable que las personas que lean esto investiguen las API RESTful. – djjeck

Respuesta

420

formularios HTML (hasta HTML versión 4 y XHTML 1) sólo admiten GET y la 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, POSTAL, PONER y BORRARse el apoyo de las implementaciones de XMLHttpRequest (es decir, llamadas AJAX) en todos los principales navegadores web (Internet Explorer, Firefox, Safari, Chrome, Ópera).

+3

"HTML (hasta la versión 4 y XHTML 1)" <- Supongo que quería decir HTTP. Recuerde: HTML es un formato de archivo (como .exe, .doc o .psd) y HTTP es un protocolo para el intercambio de información (como páginas web HTML, imágenes o archivos word .doc). –

+164

No, definitivamente me refiero a HTML (estoy hablando de capacidades de formularios HTML, aunque eso puede no estar claro en el texto, lo voy a editar) –

+6

@Matthew: ¿esto significa que si uso IE6 o IE7, con lo siguiente : -

...
no funcionará porque PUT no es válido para HTML 4? –

15

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 sí escribí) que usted escribió XMLHttpRequest; Quise decir que usted escribió el código que usa XMLHttpRequest. Los navegadores no son compatibles de forma nativa 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 son compatibles con PUT y DELETE, porque en realidad es JavaScript el que los respalda.

+0

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

+9

@Jacob Es cierto, pero los diferentes navegadores tienen diferentes motores de JavaScript. Saber cuáles son compatibles con PUT sigue siendo útil. – senfo

+1

'en realidad es JavaScript que los respalda'. No es verdad 'XMLHttpRequest' es un 'objeto-host', lo que significa que es un objeto que expone la funcionalidad del host al código Javascript. No es parte de JS en sí. –

40

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 8.0, e IE 7.0.

The open() method en el objeto toma el HTTP Método como un argumento - y se especifica como de tomar cualquier método válido HTTP (ver el número de artículo 5 del enlace) - incluyendo GET, POST, HEAD, PUT y DELETE, como specified by RFC 2616.

Como una nota al margen IE 7–8 only permit the following HTTP methods: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "LOCK", "UNLOCK", and "OPTIONS".

+7

Esperaba ver algunas piezas de documentación para seguir leyendo, no he dicho que no te crea. Los enlaces en wikipedia son bastante buenos en realidad. Gracias – naugtur

74

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

XMLHttpRequest es compatible con todos los métodos, incluido CHICKEN, aunque algunos nombres de métodos se comparan con las mayúsculas y minúsculas (los métodos distinguen mayúsculas de minúsculas por HTTP) y algún método los nombres no son compatibles en absoluto por razones de seguridad (por ejemplo, CONNECT).

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

+4

El último borrador de HTML5 parece haber eliminado el soporte PUT y DELETE: http://dev.w3.org/html5/spec/Overview.html#attr-fs-method –

+3

Se ha propuesto un borrador para recuperarlo: http: //amundsen.com/examples/put-delete-forms/ –

+23

¿POLLO? ¿El pájaro? Supongo que te refieres a CHECKIN. Es un intercambio de vocales gracioso. – JayC

8

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.

+5

¿Alguien puede confirmar qué versión de Safari obtuvo soporte para PUT y DELETE? – mjs

+0

¿Puede alguien dar más detalles si todos los navegadores AHORA soportan PUT & DELETE? Y aproximadamente cuánto tiempo ha estado disponible. Observando en el ejemplo "CHICKEN", ¿esto significa que depende totalmente del servidor interpretar qué método se usa Y que JavaScript no restringe el tipo de método ...? – Cody

13

solución _method campo oculto

usados ​​en Rails y podrían adaptarse a cualquier marco:

  • añadir un _method parámetro oculto de cualquier tipo que no es GET o POST:

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

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

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

  • procesos _method en el servidor y hacer exactamente como si ese método había sido enviado en lugar de la prueba POST real

Razó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

7

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

para ser compatible con los navegadores XMLHttpRequest Level 2 debe apoyar estos métodos. Para comprobar qué navegadores son compatibles con XMLHttpRequest Nivel 2 Recomiendo CanIUse:

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

Sólo Opera Mini se carece de apoyo atm (Juli '15), pero Opera Mini carece de soporte para todo. :)

Cuestiones relacionadas