Pelo que vale a pena, faço isso de maneira diferente. Uma chamada bem-sucedida apenas possui os objetos JSON. Não preciso de um objeto JSON de nível superior que contenha um campo de sucesso indicando true e um campo de carga útil que tenha o objeto JSON. Acabo de retornar o objeto JSON apropriado com um 200 ou o que for apropriado no intervalo 200 para o status HTTP no cabeçalho.
No entanto, se houver um erro (algo na família 400), retornarei um objeto de erro JSON bem formado. Por exemplo, se o cliente estiver postando um usuário com um endereço de e-mail e número de telefone e um deles estiver malformado (ou seja, não posso inseri-lo no meu banco de dados subjacente), retornarei algo como isto:
{
"description" : "Validation Failed"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Invalid phone number."
} ],
}
Os bits importantes aqui são que a propriedade "field" deve corresponder exatamente ao campo JSON que não pôde ser validado. Isso permite que os clientes saibam exatamente o que deu errado com sua solicitação. Além disso, "message" está no local da solicitação. Se os "emailAddress" e "phoneNumber" forem inválidos, a matriz "errors" conterá entradas para ambos. Um corpo de resposta 409 (Conflict) JSON pode ter a seguinte aparência:
{
"description" : "Already Exists"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Phone number already exists for another user."
} ],
}
Com o código de status HTTP e esse JSON, o cliente tem tudo o que precisa para responder a erros de maneira determinística e não cria um novo padrão de erro que tenta concluir a substituição dos códigos de status HTTP. Observe que isso ocorre apenas no intervalo de 400 erros. Para qualquer coisa na faixa de 200, posso apenas retornar o que for apropriado. Para mim, geralmente é um objeto JSON do tipo HAL, mas isso realmente não importa aqui.
A única coisa que pensei em adicionar foi um código de erro numérico nas entradas da matriz "errors" ou na raiz do próprio objeto JSON. Mas até agora não precisamos disso.