2011-08-10 17 views
18

Estoy aprendiendo sobre REST y PUT/DELETE, he leído que ambos (junto con GET) son idempotentes, lo que significa que múltiples solicitudes ponen al servidor en el mismo estado.¿Está PUT/DELETE idempotent con REST automatic?

¿Alguna de las solicitudes duplicadas PUT/DELETE sale del navegador web (cuando se usa XMLHttpRequest)? En otras palabras, ¿el servidor estará actualizando el mismo registro de la base de datos para cada solicitud PUT, o las solicitudes duplicadas serán ignoradas automáticamente?

En caso afirmativo, ¿cómo se usa PUT o ELIMINAR diferente de simplemente usar POST?

Leí un artículo que sugería que los servicios web RESTful eran el camino a seguir. ¿Hay alguna razón particular por la cual los formularios HTML5 no son compatibles con los métodos PUT/DELETE?

+5

Nada es automático. Solo son idempotentes si el servidor que recibe las solicitudes es realmente RESTful y las implementa de manera idempotente. No estoy escribiendo esto como respuesta porque está fuera del tema de StackOverflow. Pregunte en http://programmers.stackexchange.com si debe preguntar. –

+1

es posible que también desee verificar las siguientes respuestas: http://stackoverflow.com/questions/4088350/is-rest-delete-really-idempotent http://stackoverflow.com/questions/630453/put-vs -post-in-rest –

Respuesta

39

REST es solo una estructura de diseño para acceso y manipulación de datos. No hay reglas claras sobre cómo un servidor debe reaccionar ante las solicitudes de datos.

Dicho esto, típicamente una solicitud resto de PUT o DELETE sería como sigue:

DELETE /item/10293 

o

PUT /item/23848 
foo=bar 
fizz=buzz 
herp=derp 

Las peticiones dadas están asociados con una ID específica. Debido a esto, decirle al servidor que elimine la misma ID 15 veces terminará con el mismo resultado que llamarlo una vez, a menos que haya algún tipo de re numeración.

Con la solicitud PUT, indicar al servidor que actualice un elemento específico a valores específicos también dará el mismo resultado.

Un caso en el que un comando sería no idempotente que normalmente implican algún tipo de valor relativo:

DELETE /item/last 

Llamando que 15 veces es probable eliminar 15 artículos, en lugar de la misma último elemento. Un mediante HTTP alternativa adecuada podría ser:

POST /item/last?action=delete 

Una vez más, resto no es una especificación oficial, es sólo una estructura con algunas cualidades comunes. Hay muchas formas de implementar una estructura RESTful.


En cuanto a las formas de apoyo HTML5 PUT & DELETE, es realmente depende de los navegadores para iniciar el apoyo a diferentes métodos en lugar de la propia especificación. Si todos los navegadores comenzaron a implementar diferentes métodos para el envío de formularios, estoy seguro de que se agregarían a las especificaciones.

Con la web funcionando como está, una buena implementación RESTful también puede incorporar alguna forma de AJAX , de todos modos, por lo que me parece en gran medida innecesario.

+2

REST no es una especificación oficial, pero nos recuerda que no debemos desviarnos de HTTP con nuevos métodos o agregar estado a las transacciones. Por lo tanto, una solicitud como 'DELETE/item/last' no es idempotente, por lo que no debe utilizarse. Por ejemplo, un navegador enviará una solicitud nuevamente sin pedir confirmación al usuario cuando responda. Además, 'POST/item/last? Action = delete' parece una mala idea, ¿cómo puedes garantizar que estás eliminando el recurso que deseas? –

+0

@JuanMendes, buen punto. De hecho, cubro este tema al final de [mi respuesta a otra pregunta] (http://stackoverflow.com/questions/4573305/rest-api-why-use-put-delete-post-get/4573426#4573426) , y probablemente debería retocar esta respuesta para reflejar un mejor enfoque. – zzzzBov

+0

Según [RFC2616] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) los métodos GET, HEAD, PUT y DELETE son idempotentes. Por lo tanto, no puede usar DELETE/item/last como tampoco tiene permitido usar GET/item/last o PUT/item/last. La razón es que los servidores intermedios deberían poder repetir la solicitud DELETE en caso de falla o falta de respuesta sin romper la lógica de la aplicación. – alpav

6

¿Alguna de las solicitudes duplicadas de PUT/DELETE alguna vez abandonan el navegador web (cuando se utiliza XMLHttpRequest)?

Sí, claro. La idempotencia es solo una convención y no se aplica.Si realiza una solicitud, duplicada o no, se ejecutará.

En otras palabras, ¿el servidor estará actualizando el mismo registro de la base de datos para cada solicitud PUT, o las solicitudes duplicadas serán ignoradas automáticamente?

Si se ajusta a REST debe actualizar el mismo registro de la base de datos dos veces, por ejemplo ejecutando UPDATE user SET name = 'John' dos veces. Sin embargo, no hay garantía de lo que hará o no hará, depende de cómo se implemente.

En caso afirmativo, ¿cómo se usa PUT o ELIMINAR diferente de simplemente usar POST?

Es solo una convención. Las solicitudes PUT y DELETE pueden tratarse o no de forma diferente a POST en el código del sitio.

Leí un artículo que sugería que los servicios web RESTful eran el camino a seguir. ¿Hay alguna razón particular por la cual los formularios HTML5 no son compatibles con los métodos PUT/DELETE?

No estoy realmente seguro, para ser sincero. Puede solucionar esto utilizando un campo <input> oculto llamado _method o similar y configúrelo en ELIMINAR o PONER, y luego manejar ese lado del servidor.

+1

XMLHttpRequest seguiría admitiendo PUT/DELETE incluso si la especificación HTML 5 no. ¿derecho? Esa sería otra solución. Supongo que así sería cuán seriamente los exploradores también toman las especificaciones. –

+0

@Deep: sí, pero técnicamente no tiene nada que ver con los formularios HTML, que es lo que pidió: S –

+4

Idempotence es más que una convención, es una promesa que el servidor hace al cliente (e intermediarios). Sin embargo, como implementador del servicio, es su responsabilidad cumplir (o romper) esa promesa. No se aplica como tal, sino que los intermediarios (es decir, los representantes) hacen suposiciones basadas en esa promesa y si no es cierto, pueden tener consecuencias negativas para su servicio o sus clientes. La única diferencia con POST es que POST no hace ninguna promesa sobre seguridad o idempotencia, por lo que los proxies no hacen suposiciones al respecto. – jhericks

0

El funcionamiento de PUT es idempotente pero no es seguro. Si la operación PUT se repite, no insertará registros duplicados. Repita la operación PUT en caso de errores NetworkFailure después de verificar encabezados condicionales como If-no modificado-since y/o si coinciden. No repetir en caso de códigos de error 4XX o 5XX.