the restful practices practice patterns nouns microsoft guidelines good designing best api http rest design api-design

patterns - restful api designing guidelines the best practices



Diseño de la API de reposo: POST para crear con datos duplicados, IntegrityError/500, ¿qué sería correcto? (2)

Tengo una APT REST normal y básica como:

/ GET - list POST - create /<id> GET - detail PUT - replace PATCH - patch DELETE - delete

Cuando aparece un POST en / , generalmente creo un objeto y hago una nueva identificación. Algunos (uno) de los campos son (es) necesarios para ser únicos. Entonces, un POST con tales datos duplicados podría resultar en:

  1. 500 - IntegrityError
  2. Haga que sea más como un PUT / PATCH a /<id> y actualice el registro existente
  3. Captura / evita el error y devuelve algún tipo de 4XX
  4. Algo más en lo que no estoy pensando.

Parece que 1 : la solicitud es mala o puedo manejarla. ¿Cuál es la forma correcta de manejar esta situación?


# 3 es más apropiado. Los errores 5xx se producen cuando hay algo mal con el servidor. Los errores 4xx se producen cuando algo está mal con la solicitud. En este caso, la solicitud es incorrecta, por lo que un 4xx es más apropiado. Ya sea un 400 o 409.

O puede hacer # 2, realmente depende del contexto.


@StevenFisher es correcto. 409 El conflicto es la respuesta correcta.

La solicitud no pudo completarse debido a un conflicto con el estado actual del recurso. Este código solo se permite en situaciones en las que se espera que el usuario pueda resolver el conflicto y volver a enviar la solicitud. El cuerpo de respuesta DEBERÍA incluir suficiente información para que el usuario reconozca la fuente del conflicto. Idealmente, la entidad de respuesta incluiría suficiente información para que el usuario o el agente de usuario corrijan el problema; sin embargo, eso podría no ser posible y no es obligatorio.

Por ejemplo, un GET encendido / podría decirle a un cliente que pueden crear usuarios de la siguiente manera

HTTP/1.1 200 OK <users href="/"> <create href="/" method="post"> <username type="xs:token" cardinality="required"/> <password type="password" cardinality="required"/> </create> ... other hypermedia controls, like search ... </users>

Seguir el control de hipermedios e intentar crear un usuario con el nombre de usuario "Skylar Saveland" podría dar como resultado

HTTP/1.1 409 Conflict <users href="/"> <create href="/" method="post"> <username type="xs:token" cardinality="required" error="The username ''Skylar Saveland'' is already taken. Please select another username"/> <password type="password" cardinality="required"/> </create> ... other hypermedia controls, like search ... </users>

Del mismo modo, intentar crear un usuario sin una contraseña puede dar como resultado

HTTP/1.1 409 Conflict <users href="/"> <create href="/" method="post"> <username type="xs:token" cardinality="required"/> <password type="password" cardinality="required" error="A password must be specified"/> </create> ... other hypermedia controls, like search ... </users>

o puede tener múltiples errores, por ejemplo,

HTTP/1.1 409 Conflict <users href="/"> <create href="/" method="post"> <username type="xs:token" cardinality="required" error="The username ''Skylar Saveland'' is already taken. Please select another username"/> <password type="password" cardinality="required" error="A password must be specified"/> </create> ... other hypermedia controls, like search ... </users>

NOTA: Se deberá crear un tipo de medio apropiado para que coincida con lo anterior, que explicará la estructura de los controles de hipermedia (incluidos los atributos de error en los formularios) y definirá el significado de los distintos nombres de los elementos (por ejemplo, usuarios, nombre de usuario, contraseña, etc.).