2012-09-30 67 views
11

que tienen un API REST básica normal como:Rest api design: POST para crear con datos duplicados, posibles IntegrityError/500, ¿cuál sería la correcta?

/ 
    GET - list 
    POST - create 

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

Cuando un POST viene a /, por lo general crear un objeto y crea una nueva identificación. Algunos (uno) de los campos son (es) necesarios para ser únicos. Por lo tanto, un post con este tipo de datos duplicados podría resultar en:

  1. 500 - IntegrityError
  2. que sea más como un PUT/PATCH-/<id> y actualizar el registro existente
  3. Capturas/evitar el error y devolver algún tipo de 4XX
  4. Algo más en lo que no estoy pensando.

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

+2

Iría con 409, "Conflicto". Pero no voy a afirmar que es la forma "correcta". :) –

Respuesta

14

@StevenFisher es correcto. 409 Conflict es la respuesta correcta.

La solicitud no se pudo completar debido a un conflicto con el estado actual del recurso. Este código solo está permitido en situaciones en las que se espera que el usuario pueda resolver el conflicto y vuelva a enviar la solicitud. El cuerpo de respuesta DEBE incluir suficiente información para que el usuario reconozca el origen del conflicto. Lo ideal sería que la entidad de respuesta incluyera suficiente información para el usuario o agente de usuario para solucionar el problema; sin embargo, es posible que no sea y no es necesario.

Por ejemplo, un GET de encendido/podría decirle a un cliente que pueden crear los 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> 

Tras el control de hipermedia y tratando de crear un usuario con el nombre de usuario "Skylar Saveland" podría resultar en

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, tratando de crear un usuario sin una contraseña podría resultar en

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 que tenga varios 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: Una adecuada media type will need to be created para ir junto con lo anterior, que explicará la estructura de los controles de hipermedia (incluyendo el error de atributos en los formularios) y definir el significado de los diversos nombres de elementos (por ejemplo, usuarios, nombre de usuario, contraseña, etc.).

1

# 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 400 o 409.

O puede hacer # 2, realmente depende del contexto.

+1

# 2 no es correcto. La POST sin ID no debe ser utilizada para actualizar una solicitud. – igorsantos07