De acuerdo con la especificación HTTP / 1.1:
El
POST
método se utiliza para solicitar que el servidor de origen acepta la entidad incluida en la solicitud como una nueva subordinado del recurso identificado por elRequest-URI
en elRequest-Line
En otras palabras, POST
se usa para crear .
El
PUT
método solicita que la entidad adjunta se almacene bajo el suministradoRequest-URI
. Si seRequest-URI
refiere a un recurso ya existente, la entidad adjunta DEBE considerarse como una versión modificada de la que reside en el servidor de origen. Si elRequest-URI
no apunta a un recurso existente, y ese URI es capaz de ser definido como un nuevo recurso por el agente de usuario solicitante, el servidor de origen puede crear el recurso con ese URI ".
Es decir, PUT
se usa para crear o reemplazar .
Entonces, ¿cuál debería usarse para crear un recurso? ¿O uno necesita apoyar a ambos?
Respuestas:
En general:
Tanto PUT como POST pueden usarse para crear.
Tienes que preguntar "¿para qué estás realizando la acción?" para distinguir lo que deberías estar usando. Supongamos que está diseñando una API para hacer preguntas. Si desea utilizar POST, debe hacerlo en una lista de preguntas. Si desea usar PUT, entonces lo haría a una pregunta en particular.
Se pueden usar ambos excelentes, así que ¿cuál debo usar en mi diseño RESTful?
No necesita admitir tanto PUT como POST.
Lo que se usa se deja a usted. Pero solo recuerde usar el correcto según el objeto al que hace referencia en la solicitud.
Algunas consideraciones
Un ejemplo:
Escribí lo siguiente como parte de otra respuesta en SO con respecto a esto :
Además, y de manera un poco más concisa, RFC 7231 Sección 4.3.4 Estados PUT (énfasis agregado),
fuente
Puede encontrar afirmaciones en la web que dicen
Ninguno de los dos tiene razón.
Mejor es elegir entre PUT y POST basado en la idempotencia de la acción.
PUT implica poner un recurso, reemplazar completamente lo que esté disponible en la URL dada con una cosa diferente. Por definición, un PUT es idempotente. Hazlo tantas veces como quieras, y el resultado es el mismo.
x=5
es idempotente ¡Puede PONER un recurso si ya existe o no (por ejemplo, para Crear o para Actualizar)!POST actualiza un recurso, agrega un recurso subsidiario o provoca un cambio. Un POST no es idempotente, de la misma manera que
x++
no lo es.Con este argumento, PUT es para crear cuando conoce la URL de la cosa que va a crear. POST se puede usar para crear cuando conoce la URL de la "fábrica" o el administrador de la categoría de cosas que desea crear.
entonces:
o:
fuente
name
ydate
. Si tenemos una entidad con un existentename
ydate
, pero luego le solicitamos que especifique solo aname
, el comportamiento correcto de PUT sería eliminar eldate
de la entidad, mientras que POST puede actualizar solo las propiedades especificadas, dejando las propiedades no especificadas como estaban antes de que se hiciera la solicitud. ¿Suena correcto / razonable, o es un uso incorrecto de PUT (vi referencias a PATCH , que parece ser más apropiado, pero aún no existe)?La especificación relevante para PUT y POST es RFC 2616 §9.5ff.
POST crea un recurso hijo , por lo que POST
/items
crea un recurso que vive debajo del/items
recurso. P.ej./items/1
. Enviar el mismo paquete postal dos veces creará dos recursos.PUT es para crear o reemplazar un recurso en una URL conocida por el cliente .
Por lo tanto: PUT es solo un candidato para CREATE donde el cliente ya conoce la URL antes de que se cree el recurso. P.ej.
/blogs/nigel/entry/when_to_use_post_vs_put
ya que el título se usa como clave de recursoPUT reemplaza el recurso en la URL conocida si ya existe, por lo que enviar la misma solicitud dos veces no tiene ningún efecto. En otras palabras, las llamadas a PUT son idempotentes .
El RFC dice así:
Nota: PUT se ha utilizado principalmente para actualizar recursos (reemplazándolos en su totalidad), pero recientemente se ha avanzado hacia el uso de PATCH para actualizar los recursos existentes, ya que PUT especifica que reemplaza todo el recurso. RFC 5789.
Actualización 2018 : hay un caso que se puede hacer para evitar PUT. Consulte "DESCANSO sin PUT"
tomado de REST API Design - Modelado de recursos por Prakash Subramaniam de Thoughtworks
Esto obliga a la API a evitar problemas de transición de estado con múltiples clientes que actualizan un solo recurso, y coincide mejor con el abastecimiento de eventos y CQRS. Cuando el trabajo se realiza de forma asíncrona, parece POSTALAR la transformación y esperar a que se aplique.
fuente
Resumen:
Crear:
Se puede realizar con PUT o POST de la siguiente manera:
Actualizar:
Puede solamente ser realizado con PUT de la siguiente manera:
Explicación:
Cuando se trata de REST y URI como general, tiene genérico a la izquierda y específico a la derecha . Los genéricos generalmente se denominan colecciones y los elementos más específicos se pueden llamar recurso . Tenga en cuenta que un recurso puede contener una colección .
Cuando usa POST siempre se refiere a una colección , así que cada vez que dice:
Está publicando un nuevo usuario en la colección de usuarios .
Si continúas e intentas algo como esto:
funcionará, pero semánticamente está diciendo que desea agregar un recurso a la colección de John en la colección de usuarios .
Una vez que está utilizando PUT, se está refiriendo a un recurso o elemento individual, posiblemente dentro de una colección . Entonces cuando dices:
le está diciendo a la actualización del servidor, o crea, si no existe, el recurso john en la colección de usuarios .
Especificaciones:
Permítanme resaltar algunas partes importantes de la especificación:
ENVIAR
Por lo tanto, crea un nuevo recurso en una colección .
PONER
Por lo tanto, cree o actualice según la existencia del recurso .
Referencia:
fuente
POST
significa "crear nuevo" como en "Aquí está la entrada para crear un usuario, créelo por mí".PUT
significa "insertar, reemplazar si ya existe" como en "Aquí están los datos para el usuario 5".Usted
POST
a example.com/users ya que no conoce laURL
del usuario, sin embargo, desea que el servidor para crearlo.Usted
PUT
a example.com/users/id~~V~~singular~~2nd ya que desea reemplazar / crear un determinado usuario.PUBLICAR dos veces con los mismos datos significa crear dos usuarios idénticos con diferentes identificadores. PONER dos veces con los mismos datos crea al usuario el primero y lo actualiza al mismo estado la segunda vez (sin cambios). Como terminas con el mismo estado después de un,
PUT
no importa cuántas veces lo realices, se dice que es "igualmente potente" cada vez, idempotente. Esto es útil para volver a intentar automáticamente las solicitudes. No más '¿estás seguro de que deseas reenviar' cuando presionas el botón Atrás en el navegador?Un consejo general es usar
POST
cuando necesite que el servidor controle laURL
generación de sus recursos. Use loPUT
contrario. PrefieroPUT
sobrePOST
.fuente
user 5
si aún no existe? No quiere decirupdate, replace if already exists
? o algo asíPUT
también se puede usar para reemplazar el valor de un recurso existente en su totalidad.Me gustaría agregar mi consejo "pragmático". Use PUT cuando sepa la "id" por la cual se puede recuperar el objeto que está guardando. El uso de PUT no funcionará demasiado bien si necesita, por ejemplo, una identificación generada en la base de datos que se devolverá para que realice futuras búsquedas o actualizaciones.
Entonces: Para guardar un usuario existente, o uno donde el cliente genera la identificación y se ha verificado que la identificación es única:
De lo contrario, use POST para crear inicialmente el objeto y PUT para actualizar el objeto:
fuente
POST /users
. (Tenga en cuenta que/users
es plural.) Esto tiene el efecto de crear un nuevo usuario y convertirlo en un recurso secundario de la/users
colección.GET /users
tiene sentido, se lee como quieras, pero estaría de acuerdo conGET /user/<id>
oPOST /user
(con la carga útil para dicho nuevo usuario) porque lee correctamente 'get me users 5' es extraño, pero 'get me user 5' es más natural. Sin embargo, probablemente aún caería del lado de la pluralización :)Use POST para crear y PUT para actualizar. Así es como Ruby on Rails lo está haciendo, de todos modos.
fuente
POST /items
agrega un nuevo elemento a un recurso ya definido ('elemento'). No, como dice la respuesta, "crea un grupo". No entiendo por qué esto tiene 12 votos.PUT /items/42
también es válido para crear un recurso, pero solo si el cliente tiene el privilegio de nombrar el recurso . (¿Rails permite a un cliente este privilegio de nomenclatura?)Ambos se utilizan para la transmisión de datos entre el cliente al servidor, pero existen diferencias sutiles entre ellos, que son:
Analogía:
Analogía de redes sociales / redes:
fuente
REST es un concepto de muy alto nivel. De hecho, ¡ni siquiera menciona HTTP en absoluto!
Si tiene dudas sobre cómo implementar REST en HTTP, siempre puede consultar la especificación del Protocolo de publicación Atom (AtomPub) . AtomPub es un estándar para escribir servicios web RESTful con HTTP que fue desarrollado por muchas luminarias HTTP y REST, con algunos aportes de Roy Fielding, el inventor de REST y (co) inventor del propio HTTP.
De hecho, incluso podría usar AtomPub directamente. Si bien surgió de la comunidad de blogs, de ninguna manera se limita a los blogs: es un protocolo genérico para interactuar RESTAMENTE con colecciones arbitrarias (anidadas) de recursos arbitrarios a través de HTTP. Si puede representar su aplicación como una colección anidada de recursos, entonces puede usar AtomPub y no preocuparse por usar PUT o POST, qué códigos de estado HTTP devolver y todos esos detalles.
Esto es lo que AtomPub tiene que decir sobre la creación de recursos (sección 9.2):
fuente
La decisión de usar PUT o POST para crear un recurso en un servidor con una API HTTP + REST se basa en quién posee la estructura de URL. Hacer que el cliente sepa o participe en la definición, la estructura de URL es un acoplamiento innecesario similar a los acoplamientos indeseables que surgieron de SOA. Escapar de los tipos de acoplamientos es la razón por la cual REST es tan popular. Por lo tanto, el método apropiado para usar es POST. Hay excepciones a esta regla y ocurren cuando el cliente desea retener el control sobre la estructura de ubicación de los recursos que implementa. Esto es raro y probablemente significa que algo más está mal.
En este punto, algunas personas argumentarán que si se usan RESTful-URL , el cliente conoce la URL del recurso y, por lo tanto, un PUT es aceptable. Después de todo, esta es la razón por la cual las URL canónicas, normalizadas, Ruby on Rails, Django son importantes, mira la API de Twitter ... bla, bla, bla. Esas personas deben comprender que no existe una URL de reposo y que el propio Roy Fielding afirma que :
La idea de una URL RESTful es en realidad una violación de REST ya que el servidor está a cargo de la estructura de la URL y debe ser libre de decidir cómo usarla para evitar el acoplamiento. Si esto le confunde, lea acerca de la importancia del autodescubrimiento en el diseño de API.
El uso de POST para crear recursos viene con una consideración de diseño porque POST no es idempotente. Esto significa que repetir una POST varias veces no garantiza el mismo comportamiento cada vez. Esto asusta a las personas a usar PUT para crear recursos cuando no deberían. Saben que está mal (POST es para CREATE) pero lo hacen de todos modos porque no saben cómo resolver este problema. Esta preocupación se demuestra en la siguiente situación:
El paso 6 es donde las personas comúnmente se confunden acerca de qué hacer. Sin embargo, no hay razón para crear un error para resolver este problema. En cambio, HTTP se puede usar como se especifica en RFC 2616 y el servidor responde:
Responder con un código de estado de 409 Conflict es el recurso correcto porque :
Actualización basada en el lanzamiento de RFC 7231 para reemplazar 2616
RFC 7231 está diseñado para reemplazar 2616 y en la Sección 4.3.3 describe la siguiente respuesta posible para un POST
Ahora puede ser tentador simplemente devolver un 303 en caso de que se repita un POST. Sin embargo, lo opuesto es verdadero. Devolver un 303 solo tendría sentido si varias solicitudes de creación (creación de diferentes recursos) devuelven el mismo contenido. Un ejemplo sería un "gracias por enviar su mensaje de solicitud" que el cliente no necesita volver a descargar cada vez. RFC 7231 aún mantiene en la sección 4.2.2 que POST no debe ser idempotente y continúa manteniendo que POST debe usarse para crear.
Para obtener más información sobre esto, lea este artículo .
fuente
Me gusta este consejo, de la definición de PUT del RFC 2616 :
Esto concuerda con el otro consejo aquí, que PUT se aplica mejor a los recursos que ya tienen un nombre, y POST es bueno para crear un nuevo objeto bajo un recurso existente (y dejar que el servidor lo nombre).
Interpreto que esto y los requisitos de idempotencia en PUT significan que:
fuente
En breve:
PUT es idempotente, donde el estado del recurso será el mismo si la misma operación se ejecuta una o varias veces.
POST no es idempotente, donde el estado del recurso puede ser diferente si la operación se ejecuta varias veces en comparación con la ejecución de una sola vez.
Analogía con consulta de base de datos
PUT Puede pensar en algo similar a "ACTUALIZAR SET DE ESTUDIANTE address =" abc "donde id =" 123 ";
POST Puede pensar en algo como "INSERTAR EN EL ESTUDIANTE (nombre, dirección) VALORES (" abc "," xyzzz ");
La identificación del estudiante se genera automáticamente.
Con PUT, si la misma consulta se ejecuta varias veces o una vez, el estado de la tabla ESTUDIANTE permanece igual.
En el caso de POST, si la misma consulta se ejecuta varias veces, se crean múltiples registros de Estudiantes en la base de datos y el estado de la base de datos cambia en cada ejecución de una consulta "INSERTAR".
NOTA: PUT necesita una ubicación de recursos (ya-resource) en la que debe realizarse la actualización, mientras que POST no lo requiere. Por lo tanto, intuitivamente POST está destinado a la creación de un nuevo recurso, mientras que PUT es necesario para actualizar el recurso ya existente.
Algunos pueden pensar que las actualizaciones se pueden realizar con POST. No hay una regla estricta sobre cuál usar para las actualizaciones o cuál usar para crear. Nuevamente, estas son convenciones, e intuitivamente me inclino por el razonamiento mencionado anteriormente y lo sigo.
fuente
POST es como publicar una carta en un buzón o publicar un correo electrónico en una cola de correo electrónico. PUT es como cuando pones un objeto en un agujero de cubículo o en un lugar en un estante (tiene una dirección conocida).
Con POST, estás publicando en la dirección de la COLA o COLECCIÓN. Con PUT, está ingresando a la dirección del ARTÍCULO.
PUT es idempotente. Puede enviar la solicitud 100 veces y no importará. POST no es idempotente. Si envía la solicitud 100 veces, recibirá 100 correos electrónicos o 100 cartas en su casilla postal.
Una regla general: si conoce la identificación o el nombre del artículo, use PUT. Si desea que la parte receptora asigne la identificación o el nombre del artículo, use POST.
fuente
Nueva respuesta (ahora que entiendo REST mejor):
PUT es simplemente una declaración de qué contenido debe usar el servicio, de ahora en adelante, para representar el recurso identificado por el cliente; POST es una declaración de qué contenido debe contener el servicio, de ahora en adelante, (posiblemente duplicado), pero depende del servidor cómo identificar ese contenido.
PUT x
(six
identifica un recurso ): "Reemplace el contenido del recurso identificado porx
con mi contenido".PUT x
(six
no identifica un recurso): "Crear un nuevo recurso que contenga mi contenido y utilizarlox
para identificarlo".POST x
: "Almacenar mi contenido y darme un identificador que pueda usar para identificar un recurso (antiguo o nuevo) que contenga dicho contenido (posiblemente mezclado con otro contenido). Dicho recurso debe ser idéntico o subordinado al quex
identifica". " Y 's de recursos está subordinada a x ' recurso s" es típicamente, pero no necesariamente implementado por hacer y una subruta de x (por ejemplo, x =/foo
y y =/foo/bar
) y la modificación de la representación (s) de x recurso 's para reflejar la existencia de un nuevo recurso, por ejemplo, con un hipervínculo a yEl recurso y algunos metadatos. Solo esto último es realmente esencial para un buen diseño, ya que las URL son opacas en REST: se supone que debe usar hipermedia en lugar de la construcción de URL del lado del cliente para atravesar el servicio de todos modos.En REST, no existe un recurso que contenga "contenido". Me refiero como "contenido" a los datos que el servicio utiliza para representar representaciones de manera consistente. Por lo general, consta de algunas filas relacionadas en una base de datos o un archivo (por ejemplo, un archivo de imagen). Depende del servicio convertir el contenido del usuario en algo que el servicio pueda usar, por ejemplo, convertir una carga útil JSON en declaraciones SQL.
Respuesta original (podría ser más fácil de leer) :
PUT /something
(si/something
ya existe): "Toma lo que tengas/something
y reemplázalo con lo que te doy".PUT /something
(si/something
aún no existe): "Toma lo que te doy y ponlo en/something
".POST /something
: "Toma lo que te doy y ponlo donde quieras/something
, siempre que me des su URL cuando hayas terminado".fuente
Respuesta corta:
Regla simple: use POST para crear, use PUT para actualizar.
Respuesta larga:
ENVIAR:
PONER:
Respuesta larga:
Para entenderlo, debemos preguntarnos por qué se requirió PUT, cuáles fueron los problemas que PUT estaba tratando de resolver que POST no pudo.
Desde el punto de vista de una arquitectura REST, no hay nada que importe. Podríamos haber vivido sin PUT también. Pero desde el punto de vista del desarrollador de un cliente, hizo su vida mucho más simple.
Antes de PUT, los clientes no podían conocer directamente la URL que generó el servidor o si todo lo que había generado o si los datos que se enviarán al servidor ya están actualizados o no. PUT alivió al desarrollador de todos estos dolores de cabeza. PUT es idempotente, PUT maneja las condiciones de carrera y PUT le permite al cliente elegir la URL.
fuente
Ruby on Rails 4.0 utilizará el método 'PATCH' en lugar de PUT para realizar actualizaciones parciales.
RFC 5789 dice acerca de PATCH (desde 1995):
" Edge Rails: PATCH es el nuevo método HTTP primario para las actualizaciones ", lo explica.
fuente
A riesgo de repetir lo que ya se ha dicho, parece importante recordar que PUT implica que el cliente controla lo que la URL terminará siendo, al crear un recurso. Por lo tanto, parte de la elección entre PUT y POST será sobre cuánto puede confiar en el cliente para proporcionar una URL correcta y normalizada que sea coherente con cualquier esquema de URL.
Cuando no puede confiar plenamente en que el cliente haga lo correcto, sería más apropiado usar POST para crear un nuevo elemento y luego enviar la URL de vuelta al cliente en la respuesta.
fuente
Location
encabezado que no contiene el nombre del recurso canónico.PUT /X-files/series/4/episodes/max
) y responde el servidor con un URI que proporciona un enlace corto canónica única para ese nuevo recurso (es decir/X-Ffiles/episodes/91
)De una manera muy simple, estoy tomando el ejemplo de la línea de tiempo de Facebook.
Caso 1: cuando publica algo en su línea de tiempo, es una nueva entrada nueva. Entonces, en este caso, usan el método POST porque el método POST no es idempotente.
Caso 2: si su amigo comenta su publicación la primera vez, eso también creará una nueva entrada en la base de datos para que se utilice el método POST.
Caso 3: si su amigo edita su comentario, en este caso, tenía una identificación de comentario, por lo que actualizará un comentario existente en lugar de crear una nueva entrada en la base de datos. Por lo tanto, para este tipo de operación, utilice el método PUT porque es idempotente. *
En una sola línea, use POST para agregar una nueva entrada en la base de datos y PUT para actualizar algo en la base de datos.
fuente
La consideración más importante es la fiabilidad . Si se pierde un mensaje POST, el estado del sistema no está definido. La recuperación automática es imposible. Para los mensajes PUT, el estado no está definido hasta el primer reintento exitoso.
Por ejemplo, puede que no sea una buena idea crear transacciones con tarjeta de crédito con POST.
Si tiene URI generados automáticamente en su recurso, aún puede usar PUT pasando un URI generado (señalando un recurso vacío) al cliente.
Algunas otras consideraciones:
fuente
Los lectores nuevos en este tema se sorprenderán con la discusión interminable sobre lo que debe hacer y la relativa ausencia de lecciones de la experiencia. El hecho de que REST sea "preferido" sobre SOAP es, supongo, un aprendizaje de alto nivel de la experiencia, pero ¿Dios debe haber progresado desde allí? Es 2016. La tesis de Roy fue en 2000. ¿Qué hemos desarrollado? ¿Fue divertido? ¿Fue fácil integrarse? ¿Apoyar? ¿Manejará el auge de los teléfonos inteligentes y las conexiones móviles inestables?
Según ME, las redes de la vida real no son confiables. Solicitudes de tiempo de espera. Se restablecen las conexiones. Las redes se caen durante horas o días a la vez. Los trenes van a túneles con usuarios móviles a bordo. Para cualquier solicitud dada (como se reconoce ocasionalmente en toda esta discusión), la solicitud puede caer en el agua en su camino, o la respuesta puede caer en el agua en su camino de regreso. En estas condiciones, emitir solicitudes PUT, POST y DELETE directamente contra recursos sustantivos siempre me ha parecido un poco brutal e ingenuo.
HTTP no hace nada para garantizar la finalización confiable de la solicitud-respuesta, y eso está bien porque este es adecuadamente el trabajo de las aplicaciones conscientes de la red. Al desarrollar una aplicación de este tipo, puede saltar a través de los aros para usar PUT en lugar de POST, luego más aros para dar un cierto tipo de error en el servidor si detecta solicitudes duplicadas. De vuelta en el cliente, debe saltar por los aros para interpretar estos errores, volver a buscar, revalidar y volver a publicar.
O puede hacer esto : considere sus solicitudes inseguras como recursos efímeros de un solo usuario (llamémoslas acciones). Los clientes solicitan una nueva "acción" en un recurso sustantivo con una POST vacía al recurso. POST se usará solo para esto. Una vez que posee de forma segura el URI de la acción recién emitida, el cliente PONE la solicitud insegura al URI de acción, no el recurso objetivo . Resolver la acción y actualizar el recurso "real" es adecuadamente el trabajo de su API, y aquí se desacopla de la red no confiable.
El servidor hace el negocio, devuelve la respuesta y la almacena contra el URI de acción acordado . Si algo sale mal, el cliente repite la solicitud (¡comportamiento natural!), Y si el servidor ya lo ha visto, repite la respuesta almacenada y no hace nada más .
Rápidamente detectará la similitud con las promesas: creamos y devolvemos el marcador de posición para el resultado antes de hacer nada. También como una promesa, una acción puede tener éxito o fracasar una vez, pero su resultado se puede obtener repetidamente.
Lo mejor de todo es que brindamos a las aplicaciones de envío y recepción la oportunidad de vincular la acción identificada de forma única con la unicidad en sus respectivos entornos. ¡Y podemos comenzar a exigir y hacer cumplir !, un comportamiento responsable de los clientes: repita sus solicitudes tanto como desee, pero no vaya a generar una nueva acción hasta que esté en posesión de un resultado definitivo de la existente.
Como tal, numerosos problemas espinosos desaparecen. Las solicitudes de inserción repetidas no crearán duplicados, y no creamos el recurso real hasta que tengamos los datos. (las columnas de la base de datos pueden permanecer no anulables). Las solicitudes de actualización repetidas no afectarán a los estados incompatibles y no sobrescribirán los cambios posteriores. Los clientes pueden (re) buscar y procesar sin problemas la confirmación original por cualquier motivo (el cliente se bloqueó, la respuesta se perdió, etc.).
Las solicitudes de eliminación sucesivas pueden ver y procesar la confirmación original, sin dar con un error 404. Si las cosas tardan más de lo esperado, podemos responder provisionalmente, y tenemos un lugar donde el cliente puede verificar el resultado definitivo. La mejor parte de este patrón es su propiedad Kung-Fu (Panda). Tomamos una debilidad, la propensión a que los clientes repitan una solicitud cada vez que no entienden la respuesta, y la convertimos en una fortaleza :-)
Antes de decirme que esto no es RESTful, considere las numerosas formas en que se respetan los principios REST. Los clientes no construyen URL. La API permanece reconocible, aunque con un pequeño cambio en la semántica. Los verbos HTTP se usan apropiadamente. Si cree que este es un gran cambio para implementar, puedo decirle por experiencia que no lo es.
Si cree que tendrá grandes cantidades de datos para almacenar, hablemos de volúmenes: una confirmación de actualización típica es una fracción de kilobyte. HTTP actualmente le da un minuto o dos para responder definitivamente. Incluso si solo almacena acciones durante una semana, los clientes tienen muchas posibilidades de ponerse al día. Si tiene volúmenes muy altos, es posible que desee un almacén de valores clave dedicado que cumpla con el ácido o una solución en memoria.
fuente
Además de las diferencias sugeridas por otros, quiero agregar una más.
En el método POST puede enviar parámetros del cuerpo en
form-data
En el método PUT , debe enviar parámetros del cuerpo en
x-www-form-urlencoded
Encabezamiento
Content-Type:application/x-www-form-urlencoded
De acuerdo con esto, no puede enviar archivos o datos multiparte en el método PUT
EDITAR
Lo que significa que si tiene que enviar
deberías usar el método POST
fuente
Parece que siempre hay cierta confusión sobre cuándo usar HTTP POST versus el método HTTP PUT para los servicios REST. La mayoría de los desarrolladores tratarán de asociar las operaciones CRUD directamente a los métodos HTTP. Argumentaré que esto no es correcto y que uno no puede simplemente asociar los conceptos CRUD a los métodos HTTP. Es decir:
Es cierto que R (etrieve) y D (elete) de las operaciones CRUD se pueden asignar directamente a los métodos HTTP GET y DELETE respectivamente. Sin embargo, la confusión radica en las operaciones C (reate) y U (actualización). En algunos casos, se puede usar PUT para crear, mientras que en otros casos se requerirá una POST. La ambigüedad radica en la definición de un método HTTP PUT versus un método HTTP POST.
De acuerdo con las especificaciones HTTP 1.1, los métodos GET, HEAD, DELETE y PUT deben ser idempotentes, y el método POST no es idempotente. Es decir que una operación es idempotente si se puede realizar en un recurso una o varias veces y siempre devuelve el mismo estado de ese recurso. Mientras que una operación no idempotente puede devolver un estado modificado del recurso de una solicitud a otra. Por lo tanto, en una operación no idempotente, no hay garantía de que uno reciba el mismo estado de un recurso.
Según la definición idempotente anterior, mi opinión sobre el uso del método HTTP PUT frente al uso del método HTTP POST para los servicios REST es: Use el método HTTP PUT cuando:
En ambos casos, estas operaciones se pueden realizar varias veces con los mismos resultados. Es decir, el recurso no se cambiará solicitando la operación más de una vez. Por lo tanto, una verdadera operación idempotente. Utilice el método HTTP POST cuando:
Conclusión
No correlacione y asigne directamente operaciones CRUD a métodos HTTP para servicios REST. El uso de un método HTTP PUT versus un método HTTP POST debe basarse en el aspecto idempotente de esa operación. Es decir, si la operación es idempotente, utilice el método HTTP PUT. Si la operación no es idempotente, utilice el método HTTP POST.
fuente
Entonces usa POST y probablemente, pero no es necesario PUT para la creación de recursos. No tienes que apoyar a ambos. Para mí POST es perfectamente suficiente. Por lo tanto, es una decisión de diseño.
Como se mencionó en su cotización, usted usa PUT para crear un recurso no asignado a un IRI, y de todos modos desea crear un recurso. Por ejemplo,
PUT /users/123/password
generalmente reemplaza la contraseña anterior por una nueva, pero puede usarla para crear una contraseña si aún no existe (por ejemplo, por usuarios recién registrados o restaurando usuarios prohibidos).fuente
Voy a aterrizar con lo siguiente:
PUT se refiere a un recurso, identificado por el URI. En este caso, lo está actualizando. Es la parte de los tres verbos que se refieren a los recursos: eliminar y obtener los otros dos.
POST es básicamente un mensaje de forma libre, cuyo significado se define "fuera de banda". Si se puede interpretar que el mensaje agrega un recurso a un directorio, estaría bien, pero básicamente debe comprender el mensaje que envía (publicar) para saber qué sucederá con el recurso.
Debido a que PUT y GET y DELETE se refieren a un recurso, también son, por definición, idempotentes.
POST puede realizar las otras tres funciones, pero luego la semántica de la solicitud se perderá en los intermediarios como cachés y servidores proxy. Esto también se aplica a proporcionar seguridad en el recurso, ya que el URI de una publicación no necesariamente indica el recurso al que se aplica (aunque puede).
Un PUT no necesita ser una creación; el servicio podría producir un error si el recurso aún no se ha creado, pero de lo contrario, actualícelo. O viceversa: puede crear el recurso, pero no permitir actualizaciones. Lo único que se requiere sobre PUT es que apunta a un recurso específico y su carga útil es la representación de ese recurso. Un PUT exitoso significa (salvo interferencia) que un GET recuperaría el mismo recurso.
Editar: Una cosa más: un PUT puede crear, pero si lo hace, la ID debe ser una ID natural, también conocida como una dirección de correo electrónico. De esa manera, cuando PUT dos veces, el segundo puesto es una actualización del primero. Esto lo hace idempotente .
Si se genera la ID (una nueva ID de empleado, por ejemplo), el segundo PUT con la misma URL crearía un nuevo registro, lo que viola la regla idempotente. En este caso, el verbo sería POST y el mensaje (no recurso) sería crear un recurso utilizando los valores definidos en este mensaje.
fuente
Se supone que la semántica es diferente, ya que se supone que "PUT", como "GET", es idempotente, lo que significa que puede hacer la misma solicitud PUT exacta varias veces y el resultado será como si la hubiera ejecutado solo una vez.
Describiré las convenciones que creo son las más utilizadas y las más útiles:
Cuando pone un recurso en una URL particular, lo que sucede es que debe guardarse en esa URL, o algo por el estilo.
Cuando PUBLICA en un recurso en una URL en particular, a menudo publica una información relacionada en esa URL. Esto implica que el recurso en la URL ya existe.
Por ejemplo, cuando desea crear una nueva transmisión, puede PONERLA en alguna URL. Pero cuando desea PUBLICAR un mensaje en una secuencia existente, PUBLICA en su URL.
En cuanto a la modificación de las propiedades de la secuencia, puede hacerlo con PUT o POST. Básicamente, solo use "PUT" cuando la operación sea idempotente; de lo contrario, use POST.
Sin embargo, tenga en cuenta que no todos los navegadores modernos admiten verbos HTTP que no sean GET o POST.
fuente
La mayoría de las veces, los usará así:
Por ejemplo:
En ambos casos, el cuerpo de la solicitud contiene los datos del recurso que se creará o actualizará. Debe ser obvio por los nombres de ruta que POST no es idempotente (si lo llama 3 veces, creará 3 objetos), pero PUT es idempotente (si lo llama 3 veces, el resultado es el mismo). PUT se usa a menudo para la operación "upsert" (crear o actualizar), pero siempre puede devolver un error 404 si solo desea usarlo para modificar.
Tenga en cuenta que POST "crea" un nuevo elemento en la colección, y PUT "reemplaza" un elemento en una URL dada, pero es una práctica muy común usar PUT para modificaciones parciales, es decir, usarlo solo para actualizar los recursos existentes y solo modifique los campos incluidos en el cuerpo (ignorando los otros campos). Esto es técnicamente incorrecto, si quiere ser REST-purist, PUT debe reemplazar todo el recurso y debe usar PATCH para la actualización parcial. Personalmente, no me importa mucho en la medida en que el comportamiento sea claro y consistente en todos sus puntos finales API.
Recuerde, REST es un conjunto de convenciones y pautas para mantener su API simple. Si termina con una solución complicada solo para marcar la casilla "RESTfull", entonces está frustrando el propósito;)
fuente
Si bien es probable que haya una forma agnóstica de describirlos, parece estar en conflicto con varias declaraciones de respuestas a sitios web.
Seamos muy claros y directos aquí. Si usted es un desarrollador de .NET que trabaja con API web, los hechos son (de la documentación de la API de Microsoft), http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web -api-that-soporta-crud-operations :
Seguro que "puede" usar "POST" para actualizar, pero solo siga las convenciones establecidas para usted con su marco dado. En mi caso es .NET / Web API, por lo que PUT es para ACTUALIZAR no hay debate.
Espero que esto ayude a cualquier desarrollador de Microsoft que lea todos los comentarios con enlaces a sitios web de Amazon y Sun / Java.
fuente
Aquí hay una regla simple:
PONER a una URL debe usarse para actualizar o crear el recurso que se puede ubicar en esa URL.
La POST a una URL debe usarse para actualizar o crear un recurso que se encuentra en otra URL ("subordinada") o que no se puede localizar a través de HTTP.
fuente
Si está familiarizado con las operaciones de la base de datos, hay
Lo uso
PUT
para Fusionar y actualizar como operaciones y lo usoPOST
para Inserciones.fuente
En la práctica, POST funciona bien para crear recursos. La URL del recurso recién creado debe devolverse en el encabezado de respuesta de Ubicación. PUT debe usarse para actualizar un recurso por completo. Por favor, comprenda que estas son las mejores prácticas al diseñar una API RESTful. La especificación HTTP como tal no restringe el uso de PUT / POST con algunas restricciones para crear / actualizar recursos. Eche un vistazo a http://techoctave.com/c7/posts/71-twitter-rest-api-dissected que resume las mejores prácticas.
fuente