Per quello che vale, lo faccio diversamente. Una chiamata riuscita ha solo gli oggetti JSON. Non ho bisogno di un oggetto JSON di livello superiore che contenga un campo di successo che indica true e un campo payload con l'oggetto JSON. Restituisco l'oggetto JSON appropriato con un 200 o qualsiasi cosa sia appropriata nell'intervallo 200 per lo stato HTTP nell'intestazione.
Tuttavia, se c'è un errore (qualcosa nella famiglia 400) restituisco un oggetto errore JSON ben formato. Ad esempio, se il client sta postando un utente con un indirizzo e-mail e un numero di telefono e uno di questi è malformato (cioè non riesco a inserirlo nel mio database sottostante) restituirò qualcosa del genere:
{
"description" : "Validation Failed"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Invalid phone number."
} ],
}
I bit importanti qui sono che la proprietà "field" deve corrispondere esattamente al campo JSON che non può essere validato. Ciò consente ai clienti di sapere esattamente cosa è andato storto nella loro richiesta. Inoltre, "messaggio" si trova nelle impostazioni internazionali della richiesta. Se sia "emailAddress" che "phoneNumber" non fossero validi, l'array "errori" conterrebbe voci per entrambi. Un corpo di risposta JSON 409 (conflitto) potrebbe essere simile al seguente:
{
"description" : "Already Exists"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Phone number already exists for another user."
} ],
}
Con il codice di stato HTTP e questo JSON il client ha tutto ciò di cui ha bisogno per rispondere agli errori in modo deterministico e non crea un nuovo standard di errore che tenta di completare la sostituzione dei codici di stato HTTP. Nota, questi si verificano solo per l'intervallo di 400 errori. Per qualsiasi cosa nella gamma 200 posso semplicemente restituire ciò che è appropriato. Per me è spesso un oggetto JSON simile a HAL ma qui non importa davvero.
L'unica cosa che ho pensato di aggiungere era un codice numerico di errore nelle voci dell'array "errori" o nella radice dell'oggetto JSON stesso. Ma finora non ne abbiamo avuto bisogno.