2012-09-30 9 views
11

Ho un normale, di base API REST come:Rest api design: POST per creare con dati duplicati, sarebbe IntegrityError/500, cosa sarebbe corretto?

/ 
    GET - list 
    POST - create 

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

Quando un POST viene a /, di solito creare un oggetto e fare un nuovo id. Alcuni (uno) dei campi sono (è) richiesti per essere unici. Quindi, un post con tali dati duplicati potrebbe comportare:

  1. 500 - IntegrityError
  2. renderlo più simile a un PUT/PATCH-/<id> e aggiornare il record esistente
  3. Cattura/evitare l'errore e tornare un po ' sorta di 4XX
  4. Qualcos'altro a cui non sto pensando.

1 sembra fuori: la richiesta è cattiva o posso gestirla. Qual è il modo corretto di gestire questa situazione?

+2

Vorrei andare con 409, "Conflitto". Ma non sto per affermare che è il modo "corretto". :) –

risposta

14

@StevenFisher è corretto. 409 Conflict è la risposta corretta.

Impossibile completare la richiesta a causa di un conflitto con lo stato corrente della risorsa . Questo codice è consentito solo in situazioni in cui si prevede che l'utente potrebbe essere in grado di risolvere il conflitto e inviare nuovamente la richiesta. Il corpo della risposta DOVREBBE includere abbastanza informazioni per l'utente per riconoscere l'origine del conflitto. Idealmente, l'entità di risposta includerebbe informazioni sufficienti per l'utente o l'agente utente per risolvere il problema; tuttavia, ciò potrebbe non essere possibile e non è richiesto.

Per esempio, un GET on/potrebbe dire a un cliente che possono creare gli utenti come segue

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> 

A seguito del controllo di ipermedia e cercando di creare un utente con il nome utente "Skylar Saveland" potrebbe comportare in

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> 

Allo stesso modo, cercando di creare un utente senza una password potrebbe risultare in

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 si potrebbe avere più errori, per esempio,

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: Un adeguato media type will need to be created di andare avanti con quanto sopra, che spiegherà la struttura dei controlli ipermediali (compreso l'errore attributi sulle forme) e definire il significato dei vari nomi di elementi (ad es. utenti, nome utente, password, ecc.).

1

# 3 è più appropriato. Gli errori 5xx sono quando c'è qualcosa di sbagliato nel server. Gli errori 4xx sono quando qualcosa non va nella richiesta. In questo caso, la richiesta è errata, quindi un 4xx è più appropriato. O 400 o 409.

Oppure si può fare # 2, in realtà dipende dal contesto.

+1

# 2 non è corretto. Il POST senza ID non dovrebbe essere usato per aggiornare una richiesta. – igorsantos07

Problemi correlati