Por lo que vale, hago esto de manera diferente. Una llamada exitosa solo tiene los objetos JSON. No necesito un objeto JSON de nivel superior que contenga un campo de éxito que indique verdadero y un campo de carga útil que tenga el objeto JSON. Acabo de devolver el objeto JSON apropiado con un 200 o lo que sea apropiado en el rango de 200 para el estado HTTP en el encabezado.
Sin embargo, si hay un error (algo en la familia 400) devuelvo un objeto de error JSON bien formado. Por ejemplo, si el cliente está PUBLICANDO a un usuario con una dirección de correo electrónico y un número de teléfono y uno de ellos está mal formado (es decir, no puedo insertarlo en mi base de datos subyacente), devolveré algo como esto:
{
"description" : "Validation Failed"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Invalid phone number."
} ],
}
Los bits importantes aquí son que la propiedad "campo" debe coincidir exactamente con el campo JSON que no se pudo validar. Esto permite a los clientes saber exactamente qué salió mal con su solicitud. Además, "mensaje" está en la configuración regional de la solicitud. Si tanto la "dirección de correo electrónico" como el "número de teléfono" no eran válidos, la matriz de "errores" contendría entradas para ambos. Un cuerpo de respuesta JSON 409 (Conflicto) podría verse así:
{
"description" : "Already Exists"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Phone number already exists for another user."
} ],
}
Con el código de estado HTTP y este JSON, el cliente tiene todo lo que necesita para responder a los errores de manera determinista y no crea un nuevo estándar de error que intente completar el reemplazo de los códigos de estado HTTP. Tenga en cuenta que esto solo ocurre para el rango de 400 errores. Para cualquier cosa en el rango 200, puedo devolver lo que sea apropiado. Para mí, a menudo es un objeto JSON similar a HAL, pero eso realmente no importa aquí.
Lo único que pensé en agregar fue un código de error numérico en las entradas de la matriz de "errores" o en la raíz del objeto JSON. Pero hasta ahora no lo hemos necesitado.