2009-07-09 12 views
37

Al mirar a mi alrededor, no puedo nombrar una sola aplicación web (no un servicio web) que utilice algo además de las solicitudes GET y POST. ¿Hay una razón específica para esto? ¿Algunos navegadores (o servidores) no admiten otros tipos de solicitudes? ¿O es esto solo por razones históricas? Me gustaría hacer uso de las solicitudes PUT y DELETE para hacer mi vida un poco más fácil desde el lado del servidor, pero soy reacio porque nadie más lo hace.¿Hay alguna razón para no usar HTTP PUT y DELETE en una aplicación web?

Respuesta

39

Actualmente, muchas personas usan PUT y DELETE, principalmente para API que no son de navegador. Algunos ejemplos son el protocolo de publicación Atom y las API de datos de Google:

Más allá de eso, no ve PUT/DELETE en el uso común porque la mayoría de los navegadores no lo hacen soporte PUT y DELETE a través de Forms. HTML5 parece ser la fijación de este:

La forma en que funciona para las aplicaciones de navegador es: la gente diseñar aplicaciones RESTful con PUT y DELETE en mente, a continuación, "túnel" esas peticiones a través de puestos de la navegador. Por ejemplo, ver a esta pregunta SO sobre cómo Ruby on Rails logra esto utilizando campos ocultos:

Por lo tanto, usted no estaría en su propio diseño de su aplicación con el conjunto más grande de HTTP verbos en mente

EDITAR: Por cierto, si tiene curiosidad acerca de por qué PUT/DELETE no se encuentran en las publicaciones del navegador, resulta que no hay una buena razón técnica. La lectura en torno a este hilo en la lista de correo de descanso discutir, especialmente los comentarios de Roy Fielding, es interesante para algún contexto:

EDIT: Hay algunos comentarios sobre si las bibliotecas de soporte AJAX todos los métodos . Se reduce a la implementación del navegador real de XMLHttpRequest. Pensé que alguien podría encontrar este enlace a mano, que prueba tu navegador para ver cuán compatible es el objeto HttpRequest con varias opciones de HTTP.

Por desgracia, no sé de una referencia que recoge estos resultados.

+6

¿Adivina qué? en la última versión (19 de octubre de 2010), el soporte PUT/DELETE en HTML5 parece eliminarse. http://www.w3.org/TR/html5/forms.html#form-submission-0 –

+0

@Xie: hallazgo interesante. Me parece contraproducente ... –

3

Algunos servidores proxy con políticas de seguridad difíciles pueden descartarlos. Estoy usando PUT y DELETE de todos modos.

3

He leído que algunos navegadores no son compatibles con otros métodos HTTP correctamente, aunque no puedo nombrar ningún detalle.

Los rieles, en particular, empaquetarán sus formularios con un parámetro de método para establecer explícitamente esto incluso si el navegador no admite esos métodos. Eso parece una precaución razonable si vas a hacer esto.

9

Sencillamente, el HTML 4.01 form element sólo permite los valores "POST" y "GET" en su method atributo

+0

Hmm, eso tendría sentido ... Pero esto no se aplica a las solicitudes de Ajax, ¿verdad? Puedo usar cualquier método que quiera? –

+0

Si el navegador está construido según la especificación HTML 4.01, no comprenderá nada más que la especificación. Eso es todo lo que puede suponer que un navegador puede hacer – Gareth

+3

Los navegadores generalmente se compilan con algo más que una especificación HTML: JavaScript no es parte de HTML 4.01. – aehlke

0

esto depende de su navegador y biblioteca Ajax. Por ejemplo, jQuery admite todos los métodos HTTP aunque el navegador no lo haga. Ver por ejemplo jQuery "ajax" documentation en el atributo "tipo".

La estructura de Java Restlet le permite tunelizar peticiones PUT y DELETE mediante operaciones HTML POST. Para ello, sólo tiene que añadir method = poner o método = eliminar a su cadena de consulta de URI, por ejemplo:

http://www.example.com/user=xyz?method=delete ... 

Esto es lo mismo que Ruby on Rails enfoque (como se describe por @ars arriba).

+2

De la documentación de jQuery: "Otros métodos de solicitud HTTP, como PUT y DELETE, también se pueden usar aquí, pero no son compatibles con todos los navegadores". Entonces estás equivocado sobre eso. –

1

Digo usar todas las características de HTTP, los navegadores se condenados, jajaja. Tal vez inspire un uso más completo y adecuado del protocolo HTTP en el futuro. Hay más cosas en la red que solo POST y GET. Acerca de las implementaciones del navegador de tiempo refleja esto.

+0

Jaja, lo deseo. Lamentablemente, no creo que hacer que mi aplicación web * no funcione * hará cualquier cosa además de enfadar a mis usuarios. :) –

+0

hmmm ... sí, supongo que tienes un punto. oh bien, fue un pensamiento agradable. – codemonkey

+2

pero espera ... funciona para Microsoft ... – codemonkey

0

Personalmente, realmente no veo ningún propósito para usar PUT o DELETE en una aplicación web. Todas las operaciones que realiza una aplicación son de lectura o escritura, también conocida como salida de entrada. ¿Por qué necesita distinguir la naturaleza de la operación en el encabezado de la solicitud HTTP? Podría hacer llamadas ajax con la misma URL de form/object/object_id y realizar varias operaciones como eliminar, actualizar, obtener el valor o crear. Con solo mirar la URL, no tengo idea de cuál es. Mediante el uso de GET y POST solamente, mis URL será:

/objeto/id/delete

/objeto/id/crear

/objeto/id/actualización

/objeto/id - GET> implícita

etc.

Con base en mi experiencia limitada, esto es mucho más limpio que los tipos de peticiones de cabecera ocultos en muchos casos. No estoy diciendo que uno nunca deba usar PUT o DELETE, solo decir, úselas solo si es absolutamente necesario.

Consulte "API web RESTful" por Leonard Richardson para obtener más información sobre diferentes casos de uso y convenciones con respecto a los métodos de solicitud HTTP en una API web REST.

Cuestiones relacionadas