Me preguntaba acerca de esto.
Supongamos que tengo un user
recurso con id
y name
campos. Si quiero actualizar un campo, podría hacer una solicitud PATCH al recurso como este
PATCH /users/42
{"name": "john doe"}
Y luego la aplicación actualizará el nombre del usuario 42.
Pero, ¿por qué si repito esta solicitud, el resultado sería diferente?
De acuerdo con RFC 5789
PATCH no es seguro ni idempotente
rest
api-design
http
web-api
mattecapu
fuente
fuente
{"name": "bendjamin franklin"}
Respuestas:
Una solicitud de PARCHE puede ser idempotente, pero no es obligatorio que lo sea. Esa es la razón por la que se caracteriza como no idempotente.
Si PATCH puede ser idempotente o no, depende en gran medida de cómo se comunican los cambios requeridos.
Por ejemplo, si el formato del parche tiene la forma de
{change: 'Name' from: 'benjamin franklin' to: 'john doe'}
, entonces cualquier solicitud de PATCH después de la primera tendría un efecto diferente (una respuesta de falla) que la primera solicitud.Otra razón para la no idempotencia puede ser que la aplicación de la modificación en algo más que el recurso original puede invalidar el recurso. Este también sería el caso si aplica el cambio varias veces.
fuente
<name>
elemento. Si el PATCH agrega un<name>
elemento a un recurso que originalmente no contenía uno, entonces aplicar el PATCH dos veces (o aplicarlo a un recurso que ya contiene a<name>
) invalida el recurso, porque de repente contendría dos<name>
elementos que no están permitidos por tales recursos.Creo que la respuesta clara cuando PATCH no es idempotente es este párrafo de RFC 5789:
Como RFC especifica que el parche contiene algunos "cambios generales" en el recurso, deberíamos mirar más allá del reemplazo de campo típico. Si el recurso es para un contador, entonces el parche puede solicitar su incremento, lo que claramente no es idempotet.
fuente
PATCH
las solicitudes describen un conjunto de operaciones que se aplicarán a un recurso; si aplica el mismo conjunto de operaciones dos veces al mismo recurso, el resultado puede no ser el mismo. Esto se debe a que definir las operaciones depende de usted. En otras palabras, debe definir las reglas de fusión .Recuerde que una
PATCH
solicitud podría usarse para parchear recursos en muchos formatos diferentes, no solo JSON.Por lo tanto, una
PATCH
solicitud puede ser idempotente si define las reglas de fusión como idempotentes .Ejemplo idempotente:
Ejemplo no idempotente:
En el segundo ejemplo utilicé una sintaxis "Mongo like" que inventé para incrementar un atributo. Claramente, esto no es idempotente, ya que enviar la misma solicitud varias veces daría como resultado resultados diferentes cada vez.
Ahora puede que se pregunte si el uso de una sintaxis inventada es válida. Según las normas , es:
Y es posible que también se pregunte si es tranquilo usar las
PATCH
solicitudes de esta manera, y muchas personas consideran que no, aquí hay una buena respuesta con muchos comentarios sobre el tema.fuente