Para una API REST en la que estoy trabajando, quiero devolver JSON en un diseño consistente:
{
"Data" : {
"Id" : 123,
"Email" : "[email protected]"
"Firstname" : "Charlie",
"Surname" : "Brown",
},
"Error" : null
}
La carga siempre contendrá "Datos" y "Error", donde uno u otro puede ser nulo.
Mi pregunta se refiere a "Datos" y puntos finales que solo devuelven un objeto. Por ejemplo, supongamos que tengo una API users/current
, que devuelve el usuario autenticado actualmente. Hubiera devuelto a ese usuario como se muestra arriba; un solo objeto JSON llamado "Datos".
Para los puntos finales que podrían devolver cero, uno o más objetos, entonces (por supuesto) haría que "Datos" sea una matriz:
{
"Data" : [
{
(first object)
},
{
(second object)
}
],
"Error" : null
}
He escuchado un punto de vista que, por coherencia, "Datos" siempre debe ser una matriz. Incluso cuando un punto final lógicamente solo devolvería un solo objeto (o nulo).
¿Qué piensan los demás? Creo que no hay necesidad de hacer "Datos" y una matriz si nunca habrá más de un objeto devuelto.
Respuestas:
Creo que este tipo de consistencia es errónea.
Es poco probable que envolver los datos en una matriz beneficie a un consumidor de API, porque aún tendría que saber cómo interpretar los datos reales. Como ejemplo, simplemente no es probable que los "datos" resulten
/users/current
y/cities/chicago/restaurants
sean manejados por el mismo código.Para los errores, por otro lado, es probable que todos los errores sean procesados por el mismo código de manejo de errores, y luego hay un beneficio al usar la misma estructura.
Pregúntese esto: si esta fuera una clase en su idioma OOP favorito, ¿haría que todos los métodos devolvieran el mismo tipo para mantener la coherencia?
fuente
/users/current
y el usuario cuya ID (posiblemente nombre de inicio de sesión) es "actual"?Si el lado receptor necesita un destinatario general para sus mensajes JSON, puede ser útil que el nodo de datos tenga el mismo formato. Por lo tanto, en este caso es útil tener siempre una matriz, para que pueda analizarse de la misma manera cada vez.
Si cada respuesta se va a manejar individualmente (diferentes llamadas a la API de diferentes métodos), puedo ver su punto, sin embargo , debe quedar absolutamente claro (a partir de las llamadas a la API) cuando se debe devolver una matriz o un objeto.
fuente
No soy un fanático del enfoque de matriz porque no ofrece una coherencia verdadera. Obliga al usuario del servicio a preguntarse sobre cosas como, ¿qué sucede si hay más de un objeto en esta matriz o deshacerse del envoltorio? matriz lo antes posible para esas matrices singleton. Aún tendrías que hacer dos cosas diferentes.
Sin embargo, si utiliza la matriz, asegúrese de que los datos nunca sean nulos. Si no hay datos, la matriz debe estar vacía. Es la única ventaja que puedo ver.
fuente
Estoy cayendo del lado de siempre devolver una matriz. En el lado del cliente, uso mi objeto de respuesta "Usuarios" ya sea para obtener todos los usuarios o solo uno. Si tiene un punto final que devuelve matrices y otro que devuelve el mismo objeto, pero nunca más de uno, aún use una matriz.
Hay argumentos similares para usar la misma lógica en el lado del servidor, solo use el mismo código si su consulta devuelve uno o varios elementos.
La única excepción sería cuando se devuelve un objeto que nunca existe como una matriz, en cualquier contexto, entonces no hay necesidad.
fuente