Quiero diseñar mi punto final de descanso con el método apropiado para el siguiente escenario.
Hay un grupo Cada grupo tiene un estado. El grupo puede ser activado o desactivado por el administrador.
¿Debo diseñar mi punto final como
PUT /groups/api/v1/groups/{group id}/status/activate
O
PATCH /groups/api/v1/groups/{group id}
with request body like
{action:activate|deactivate}
http
rest
http-put
http-method
http-patch
java_geek
fuente
fuente
activate
" no es una construcción RESTful adecuada. Probablemente esté intentando actualizarstatus
a "activo" o "desactivado". en cuyo caso puede PARCHEAR.../status
con la cadena "activa" o "desactivada" en el cuerpo. O si está intentando actualizar un booleano enstatus.active
, puede PARCHEAR.../status/active
con el booleano en el cuerpoRespuestas:
El
PATCH
método es la opción correcta aquí, ya que está actualizando un recurso existente: el ID del grupo.PUT
solo debe usarse si está reemplazando un recurso en su totalidad.Más información sobre la modificación parcial de recursos está disponible en RFC 5789 . Específicamente, el
PUT
método se describe de la siguiente manera:fuente
La R en REST significa recurso
(Lo cual no es cierto, porque significa Representacional, pero es un buen truco para recordar la importancia de los Recursos en REST).
Acerca de
PUT /groups/api/v1/groups/{group id}/status/activate
: estás no actualizando una "activar". Un "activar" no es una cosa, es un verbo. Los verbos nunca son buenos recursos. Una regla general: si la acción, un verbo, está en la URL, probablemente no sea RESTful .¿Qué haces en su lugar? O bien está "agregando", "eliminando" o "actualizando" una activación en un Grupo, o si lo prefiere: manipulando un recurso de "estado" en un Grupo. Personalmente, usaría "activaciones" porque son menos ambiguas que el concepto "estado": crear un estado es ambiguo, crear una activación no lo es.
POST /groups/{group id}/activation
Crea (o solicita la creación de) una activación.PATCH /groups/{group id}/activation
Actualiza algunos detalles de una activación existente. Como un grupo tiene solo una activación, sabemos a qué recurso de activación nos referimos.PUT /groups/{group id}/activation
Inserta o reemplaza la activación anterior. Como un grupo tiene solo una activación, sabemos a qué recurso de activación nos referimos.DELETE /groups/{group id}/activation
Cancelará o eliminará la activación.Este patrón es útil cuando la "activación" de un Grupo tiene efectos secundarios, como los pagos realizados, los correos enviados, etc. Solo POST y PATCH pueden tener tales efectos secundarios. Cuando, por ejemplo, una eliminación de una activación necesita, por ejemplo, notificar a los usuarios por correo, ELIMINAR no es la opción correcta; en ese caso, es probable que desee crear un recurso de desactivación :
POST /groups/{group_id}/deactivation
.Es una buena idea seguir estas pautas, porque este contrato estándar lo deja muy claro para sus clientes, y todos los poderes y capas entre el cliente y usted saben cuándo es seguro volver a intentarlo y cuándo no. Digamos que el cliente está en algún lugar con wifi débil, y su usuario hace clic en "desactivar", lo que desencadena un
DELETE
: Si eso falla, el cliente puede simplemente volver a intentarlo, hasta que obtenga un 404, 200 o cualquier otra cosa que pueda manejar. Pero si activa unPOST to deactivation
, sabe que no debe volver a intentarlo: la POST implica esto.Cualquier cliente ahora tiene un contrato que, cuando se sigue, protegerá contra el envío de 42 correos electrónicos "su grupo ha sido desactivado", simplemente porque su biblioteca HTTP seguía reintentando la llamada al backend.
Actualización de un solo atributo: use PATCH
PATCH /groups/{group id}
En caso de que desee actualizar un atributo. Por ejemplo, el "estado" podría ser un atributo en los Grupos que se pueden configurar. Un atributo como "estado" suele ser un buen candidato para limitarse a una lista blanca de valores. Los ejemplos usan algunos esquemas JSON indefinidos:
Reemplazar el recurso, sin efectos secundarios, utiliza PUT.
PUT /groups/{group id}
En caso de que desee reemplazar un grupo completo. Esto no significa necesariamente que el servidor realmente cree un nuevo grupo y descarte el anterior, por ejemplo, los identificadores pueden seguir siendo los mismos. Pero para los clientes, esto es lo que PUT puede significar: el cliente debe asumir que obtiene un elemento completamente nuevo, basado en la respuesta del servidor.
El cliente, en caso de una
PUT
solicitud, siempre debe enviar todo el recurso, con todos los datos necesarios para crear un nuevo elemento: por lo general, los mismos datos que requeriría una creación POST.Un requisito muy importante es que
PUT
sea idempotente: si necesita efectos secundarios al actualizar un Grupo (o cambiar una activación), debe usarloPATCH
. Entonces, cuando la actualización resulte, por ejemplo, en el envío de un correo, no lo usePUT
.fuente
Recomendaría usar PATCH, porque su recurso 'grupo' tiene muchas propiedades pero en este caso, está actualizando solo el campo de activación (modificación parcial)
según el RFC5789 ( https://tools.ietf.org/html/rfc5789 )
Además, en más detalles,
El código de respuesta para PATCH es
también consulte thttp: //restcookbook.com/HTTP%20Methods/patch/
fuente
Dado que desea diseñar una API utilizando el estilo arquitectónico REST, debe pensar en sus casos de uso para decidir qué conceptos son lo suficientemente importantes como para exponerlos como recursos. Si decide exponer el estado de un grupo como un recurso secundario, puede asignarle el siguiente URI e implementar soporte para los métodos GET y PUT:
La desventaja de este enfoque sobre PATCH para la modificación es que no podrá realizar cambios a más de una propiedad de un grupo atómica y transaccionalmente. Si los cambios transaccionales son importantes, use PATCH.
Si decide exponer el estado como un recurso secundario de un grupo, debería ser un enlace en la representación del grupo. Por ejemplo, si el agente obtiene el grupo 123 y acepta XML, el cuerpo de la respuesta podría contener:
Se necesita un hipervínculo para cumplir con el hipermedia como el motor de la condición de estado de aplicación del estilo arquitectónico REST.
fuente
Generalmente preferiría algo un poco más simple, como
activate
/deactivate
sub-resource (vinculado por unLink
encabezado conrel=service
).o
Para el consumidor, esta interfaz es muy simple, y sigue los principios REST sin atascarse en la conceptualización de "activaciones" como recursos individuales.
fuente
Una posible opción para implementar tal comportamiento es
Y obviamente, si alguien necesita desactivarlo,
PUT
tendráDeactivated
estado en JSON.En caso de necesidad de activación / desactivación masiva,
PATCH
puede ingresar al juego (no para el grupo exacto, sino para elgroups
recurso:En general, esta es una idea como sugiere @Andrew Dobrowolski, pero con ligeros cambios en la realización exacta.
fuente