api - una - verbos http rest
¿En REST es POST o PUT el más adecuado para la operación de restauración? (4)
Si el usuario envía la clave "k1", la inserto en la base de datos. Esto se considera POST o PUT.
De acuerdo con la especificación HTTP :
El método PUT solicita que la entidad adjunta se almacene bajo el URI de solicitud proporcionado. Si el URI de solicitud se refiere a un recurso ya existente, la entidad adjuntada DEBERÍA considerarse como una versión modificada de la que reside en el servidor de origen. Si el URI de solicitud no apunta a un recurso existente, y ese URI puede definirse como un recurso nuevo por el agente de usuario solicitante, el servidor de origen puede crear el recurso con ese URI.
Por lo tanto, creo que el uso de PUT para insertar o actualizar es perfectamente legítimo, siempre que en ambos casos el URI se conozca de antemano. Si está utilizando la clave como parte del URI (como k1 en http://www.somewhere.com/resources/k1 ) este debería ser el caso. Para ser idealmente RESTful, sin embargo, un GET a la misma URL también debería permitirle descargar el recurso.
También tengo otra operación que elimina todas las claves existentes y agrega la nueva clave, es esta POST o PUT porque borra los registros y agrega uno nuevo.
No creo que esta operación se pueda considerar RESTful porque hace dos cosas. Parece proporcionar una macro para satisfacer las necesidades de un cliente en particular, en lugar de un simple acceso a los datos. Un diseño RESTful estándar sería
- Obtener una lista de claves enviando un GET a la URL principal. En el ejemplo anterior, eso sería http://www.somewhere.com/resources ;
- Borrando cada una de esas teclas enviando un DELETE a http://www.somewhere.com/resources/k1 ;
- Agregar el reemplazo enviando un PUT a http://www.somewhere.com/resources/k2 .
Es menos clara, pero creo que también sería legítimo eliminar todos los recursos enviando una sola solicitud DELETE a http://www.somewhere.com/resources .
Guardo un almacenamiento de clave-valor en el servidor para el cliente. Si el usuario envía la clave "k1", la vuelvo a insertar en la base de datos. ¿Esto se considera POST
o PUT
?
También tengo otra operación que elimina todas las claves existentes y agrega la nueva clave. Es este POST
o PUT
porque borra los registros y agrega uno nuevo.
La idea detrás de la operación de restauración es que los clientes tienen información sobre / decidir sobre la estructura de datos y el envío de datos con valor clave. Por lo tanto, el modelo de solicitud para la operación de restauración es muy similar a la operación de actualización con la clave incluida en el siguiente ejemplo:
/customers/jimmy
El método esperado para actualizar un registro existente es PUT. Entonces tu elección debería ser PUT.
POST generalmente se utiliza para insertar un nuevo registro con un nuevo contenido como en el ejemplo a continuación:
POST /customers HTTP/1.1
Content-Type: ...
Content-Length: ...
Host: server.yourdomain.com
Accept: ...
User-Agent: ...
id jimmy
name jimmy
Occupation er
Por lo tanto, en su caso no necesita ninguna operación POST porque PUT para operación de inserción también cubre eso.
Aquí la pregunta crítica sobre la mejora es la probabilidad de que confíes en tu cliente sobre la operación de restauración. Si un cliente desea insertar un nuevo registro con una clave existente, ¿qué ocurre? En su caso, debe manejar esta solicitud como una actualización porque las solicitudes de inserción y actualización llegan a la misma API y usted tiene un registro existente. Esta es la pregunta que debe responder de su lado sobre el diseño.
La respuesta de Polly Shaw es correcta, pero me gustaría mencionar que, dado que es muy probable que el mensaje esté incompleto (sin la ID cuando el recurso aún no se ha creado), un verbo PATCH sería un poco más correcto.
https://tools.ietf.org/html/rfc5789
Esta es una afinación extremadamente fina.
Si mezclas todo, probablemente no estés haciendo REST. Desde servicios web RESTful: los conceptos básicos POST
y PUT
tienen un escenario de uso distinto:
To create a resource on the server, use POST. To retrieve a resource, use GET. To change the state of a resource or to update it, use PUT. To remove or delete a resource, use DELETE.
Así que considere POST
como publicar un nuevo ticket en un blog y PUT
para cambiar un valor existente.
La eliminación se debe hacer como una operación distintiva con el verbo DELETE
. Como "eliminar todo" antes de la actualización no parece una buena idea.