¿Qué métodos HTTP coinciden con qué métodos CRUD?

213

En la programación de estilo RESTful, debemos usar métodos HTTP como nuestros bloques de construcción. Sin embargo, estoy un poco confundido sobre qué métodos coinciden con los métodos CRUD clásicos. GET / Read y DELETE / Delete son lo suficientemente obvios.

Sin embargo, ¿cuál es la diferencia entre PUT / POST? ¿Coinciden uno a uno con Crear y actualizar?

Dibujó
fuente

Respuestas:

298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT puede correlacionarse con Crear y Actualizar, dependiendo de la existencia del URI utilizado con el PUT.

PUBLICAR mapas para crear.

Corrección: POST también se puede asignar a Actualizar, aunque generalmente se usa para Crear. POST también puede ser una actualización parcial, por lo que no necesitamos el método PATCH propuesto.

Paul Morgan
fuente
16
+1: La distinción que hace entre PUT para crear recursos cuyos nombres (URI) son asignados por el cliente y POST para crear recursos cuyos nombres son asignados por el servidor es importante. Vea Richardson y Ruby's Restful Web Services (O'Reilly) para una discusión al respecto.
Jim Ferrans
99
Y dado que PUT y DELETE aún no son compatibles con los navegadores web, se considera correcto "sobrecargar POST" agregando un argumento de cadena de consulta como method = PUT o method = DELETE en el URI que se está PUBLICANDO.
Jim Ferrans
2
Nice analiza jcalcote.wordpress.com/2008/10/16/…
Boris Ivanov
13
@JimFerrans PUT y DELETE son compatibles con los navegadores web perfectamente, con XHR. Sin embargo, en el contexto de los formularios HTML, la especificación HTML no los admite, por lo que los navegadores tampoco pueden hacerlo.
Eis
3
Si bien no se asigna de forma canónica a una letra en CRUD, muchos marcos REST también usan GET / entity / para enumerar entidades de tipo entidad . GET / entity / id leerá la entidad particular que coincida con el id .
Toddius Zho
49

La clave es si estás haciendo un cambio idempotente o no. Es decir, si tomar medidas sobre el mensaje dos veces resultará en que "lo mismo" esté allí, como si solo se hiciera una vez, usted tiene un cambio idempotente y debe asignarse a PUT. Si no, se asigna a POST. Si nunca permite que el cliente sintetice URL, PUT está bastante cerca de Actualizar y POST puede manejar Crear bien, pero esa no es la única forma de hacerlo; Si el cliente sabe que quiere crear /foo/abcy sabe qué contenido poner allí, funciona bien como PUT.

La descripción canónica de un POST es cuando te comprometes a comprar algo: esa es una acción que nadie quiere repetir sin saberlo. Por el contrario, configurar la dirección de envío para el pedido de antemano se puede hacer con PUT bien: no importa si le dicen que envíe 6 Anywhere Dr, Nowherevilleuna, dos o cien veces: sigue siendo la misma dirección. ¿Eso significa que es una actualización? Podría ser ... Todo depende de cómo quieras escribir el back-end. (Tenga en cuenta que los resultados pueden no ser idénticos: podría informar al usuario la última vez que realizó un PUT como parte de la representación del recurso, lo que garantizaría que los PUT repetidos no causen un resultado idéntico, pero el resultado aún ser "lo mismo" en un sentido funcional.)

Compañeros de Donal
fuente
1
Esta distinción entre los casos de uso para POSTy PUTes interesante, y debería responder a "¿Cuál es 'crear' y cuál es 'actualizar'?" mucho más claro Además, con respecto a la implementación de la API, se deduciría que un repetitivo PUTdebería equivaler a un no-op silencioso, mientras que un repetitivo POSTpodría arrojar una excepción si se supone que algún aspecto de los datos enviados se mantiene único en el almacén de datos. eso respalda la aplicación.
zerobandwidth
2
Esta respuesta y una siguiente comentario aumento un punto importante, que la precaución debe ser ejercida de equiparar a CRUD de cerca la semántica (1x1) con HTTP REST. Este no es un mapeo canónico.
Martin Spamer
35

Estaba buscando la misma respuesta, esto es lo que dice IBM. Enlace de IBM

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
ex0b1t
fuente
10

En este momento (2016) los últimos verbos HTTP son GET, POST, PATCH , PUT y DELETE

Visión general

  • HTTP GET - SELECCIONAR / Solicitar
  • HTTP PUT - ACTUALIZACIÓN
  • POST HTTP - INSERTAR / Crear
  • PARCHE HTTP : cuando PONER una representación de recursos completa es engorrosa y utiliza más ancho de banda, por ejemplo: cuando tiene que actualizar parcialmente una columna
  • HTTP DELETE - DELETE

¡Espero que esto ayude!

Si está interesado en diseñar API REST, ¡esta es una lectura increíble! sitio web versión en línea repositorio github

d1jhoni1b
fuente
1
A partir de febrero del '18, tenga en cuenta que PATCH no está completamente implementado en las bibliotecas de clientes y servidores.
Dizzley
oh ok gracias ya veo ... ¿te importaría publicar un enlace / referencia para que pueda echar un vistazo por favor?
d1jhoni1b
9

Hay una gran conversación de video de YouTube con Stormpath que en realidad explica esto, la URL debe saltar a la parte correcta del video:

tormentoso video de youtube

También vale la pena verlo, es más de una hora de conversación pero muy interesante si está pensando en invertir tiempo en construir una API REST.

carnoso
fuente
7

Depende de la situación concreta ... pero en general:

PUT = actualizar o cambiar un recurso concreto con un URI concreto del recurso.

POST = crear un nuevo recurso bajo la fuente del URI dado.

Es decir

Editar una publicación de blog:

PUT: / blog / entry / 1

Crea uno nuevo:

POST: / blog / entrada

PUT puede crear un nuevo recurso en algunas circunstancias donde el URI del nuevo recurso está claro antes de la solicitud. POST también se puede utilizar para implementar varios otros casos de uso, que no están cubiertos por los demás (GET, PUT, DELETE, HEAD, OPTIONS)

La comprensión general para los sistemas CRUD es GET = solicitud, POST = crear, Put = actualizar, DELETE = eliminar

Atascado
fuente
4

Los componentes básicos de REST son principalmente los recursos (y URI) y los hipermedios. En este contexto, GETes la forma de obtener una representación del recurso (que de hecho se puede asignar a a SELECTen términos CRUD).

Sin embargo, no necesariamente debe esperar un mapeo uno a uno entre las operaciones CRUD y los verbos HTTP. La principal diferencia entrePUT y POSTes acerca de su propiedad idempotente. POSTtambién se usa más comúnmente para actualizaciones parciales, ya que PUTgeneralmente implica enviar una nueva representación completa del recurso.

Sugeriría leer esto:

La especificación HTTP también es una referencia útil:

El método PUT solicita que la entidad adjunta se almacene bajo el URI de solicitud proporcionado.

[...]

La diferencia fundamental entre las solicitudes POST y PUT se refleja en el significado diferente del Request-URI. El URI en una solicitud POST identifica el recurso que manejará la entidad adjunta. Ese recurso podría ser un proceso de aceptación de datos, una puerta de entrada a algún otro protocolo o una entidad separada que acepte anotaciones. Por el contrario, el URI en una solicitud PUT identifica la entidad adjunta a la solicitud: el agente de usuario sabe a qué se destina el URI y el servidor NO DEBE intentar aplicar la solicitud a otro recurso. Si el servidor desea que la solicitud se aplique a un URI diferente,

Bruno
fuente
3

En términos generales, este es el patrón que uso:

  • HTTP GET - SELECCIONAR / Solicitar
  • HTTP PUT - ACTUALIZACIÓN
  • POST HTTP - INSERTAR / Crear
  • HTTP DELETE - DELETE
AJ
fuente
55
PUT y POST no coinciden exactamente con Update o Create; PUT se "establece" (es decir, donde conoce el nombre del recurso de antemano y le está dando el valor para usar) y POST es todo lo demás. La clave es pensar si lo que estás haciendo es idempotente o no.
Donal Fellows
1
+1 en el comentario. El supuesto de un mapeo absoluto entre los dos puede ser engañoso. Una operación HTTP DELETE a algún URI, por ejemplo, simplemente podría modificar (es decir, ACTUALIZAR) un registro del lado del servidor para que una operación HTTP GET ya no devuelva una representación.
pararse el
44
PUT y POST no coinciden exactamente con Actualizar o Crear . Es cierto, pero AJ describen qué patrón se utiliza.
Piotr Dobrogost
1

El proyecto Symfony intenta mantener sus métodos HTTP unidos con los métodos CRUD, y su lista los asocia de la siguiente manera:

  • GET Recuperar el recurso del servidor
  • POST Cree un recurso en el servidor
  • PUT Actualiza el recurso en el servidor
  • BORRAR Eliminar el recurso del servidor

Vale la pena señalar que, como dicen en esa página, "en realidad, muchos navegadores modernos no admiten los métodos PUT y DELETE".

Por lo que recuerdo, Symfony "falsifica" PUT y DELETE para aquellos navegadores que no los admiten al generar sus formularios, para tratar de estar tan cerca de usar el método HTTP teóricamente correcto incluso cuando un navegador no admite eso.

Matt Gibson
fuente