Sto creando un'API RESTful che elabora un numero di interazioni utente, incluso l'inserimento di ordini tramite carte di credito memorizzate.Qual è la risposta del codice di stato HTTP appropriata per una richiesta generale non riuscita (non un errore)?
In caso di un ordine riuscito, restituisco un 200 OK e nel caso in cui la richiesta di ordine non sia corretta o non valida restituisco una richiesta non valida di 400. Ma cosa dovrei restituire se c'è un problema durante l'elaborazione effettiva dell'ordine?
- Client POSTS ordine al server per una risorsa utente. Se l'utente non esiste, viene restituito 404 non trovato.
- Il formato e le informazioni dell'ordine sono convalidati. Se non è valido, viene restituita 400 Richiesta non valida.
- L'ordine viene elaborato. Se l'ordine ha esito positivo, viene restituito un 201 creato per l'ordine. Se si verifica un errore imprevisto, viene restituito un errore di 500 server.
L'ultimo passaggio è il problema: cosa restituisco se l'ordine non viene completato per altri motivi? possibili scenari potrebbero includere:
- prodotto è esaurito
- utente limite massimo ordine raggiunto fallimento
- credito transazione con carta (fondi insufficienti, ecc)
Questo non sembra come sarebbe appropriato per un 400 o un 500. Se potessi vederlo come un 400 se non c'è un codice migliore, la richiesta non era valida secondo le regole aziendali. Semplicemente non sembra accurato.
Modifica: trovato anche this existing discussion dello stesso argomento. Tutte le risposte sembrano puntare a utilizzare i codici di stato per questo tipo di violazione, con alcune discussioni tra l'utilizzo di 400, 409 o l'estensione 422.
Mi piace '422 entità Unprocessable' per errori di convalida. E lo userebbero per i tuoi esempi sopra, includere un messaggio nella risposta con il problema aziendale attuale "Il prodotto è esaurito" e possibilmente aggiungere i tuoi "codici" se il cliente ha bisogno di prendere decisioni diverse in base alla risposta – house9