Come gestire le regole aziendali con un'API REST?

7

Ho un'API REST per gestire un sistema di prenotazione Sto cercando come gestire questa situazione:

Un cliente può prenotare una fascia oraria: Una risorsa TimeSlot viene creata e collegata a una risorsa Person. Per creare il collegamento tra un lotto temporale e una persona, il client REST invia una richiesta POST sulla risorsa TimeSlot

Ma se troppe persone hanno prenotato lo stesso slot (diciamo che il limite è di 5 link), deve essere impossibile creare più associazioni.

Come posso gestire questa restrizione aziendale? Posso restituire un codice di stato 404 con una risposta JSON che specifica l'errore con un codice di stato?

È un approccio RESTFul?

EDIT:

Come suggerito di seguito, ho usato lo stato 409 Conflict oltre a una risposta JSON che specifica l'errore

EDIT 2:

Come dettagliato nel @Cormac Mulhall, il 403 Proibito è il codice di stato più accurato per questo caso

    
posta Sylvain 22.07.2014 - 11:48
fonte

3 risposte

9

Ti voglio 403 Proibito. Dalle specifiche HTTP

403 Forbidden: The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated.

Non dovresti usare 409, significa che il cliente potrebbe essere in grado di risolvere il conflitto, che in caso di prenotazione eccessiva il cliente non può fare come le regole di conflitto sono lato server.

Ricorda che nel contesto dei codici di stato HTTP "conflitto" indica un conflitto nello stato della risorsa (in questo caso l'intervallo di tempo del libro), ad esempio, si aspetta il tempo in un formato e l'hai inviato nel formato errato [cattivo esempio, meglio uno sarebbe due client aggiorna una risorsa nello stesso momento e il server non può capire quale aggiornamento salvare, come su un sistema controllato in versione]. La risorsa è una fascia oraria, se cambi in una fascia oraria diversa hai creato una risorsa diversa, non risolto un conflitto con questa risorsa.

409 Conflict: The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request.

Il server dovrebbe restituire 403 Proibito con una spiegazione che si rifiuta di salvare lo stato perché quella fascia oraria è già piena. Nulla di ciò che il cliente può fare modificando lo stato della risorsa può cambiarlo. Il cliente non deve inviare nuovamente. Devono invece creare una nuova fascia oraria (è possibile restituire lo spazio libero più vicino come suggerimento).

    
risposta data 25.08.2014 - 13:25
fonte
4

404 indica che una risorsa non è stata trovata. Un codice di risposta più appropriato sarebbe un 409 con un corpo contenente più dettagli se la natura del conflitto.

    
risposta data 22.07.2014 - 17:30
fonte
1

Attenzione : vedi la risposta di Cormac Mullhall

404 significa risorsa non trovata. Usarlo qui non sarebbe appropriato. Perché la risorsa esiste chiaramente, ma non può essere manipolata. Secondo Quick Tips ( link ) 409 Conflict sarebbe un buon modo per andare. Ovviamente puoi restituire 200 con un messaggio di errore nel corpo. Il cliente è ancora responsabile della lettura delle risposte e dell'azione su di esse.

    
risposta data 22.07.2014 - 17:24
fonte

Leggi altre domande sui tag