¿Siempre devuelve objetos individuales en una matriz para las cargas útiles de REST API JSON?

8

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.

Diego Barros
fuente
Creo que si hubiera algún tipo de error, devolvería un código 400 o 500 apropiado y enviaría cualquier detalle en el contenido. Devolver una sección para datos parece extraño y posiblemente confuso, especialmente si tiene datos Y error establecidos en su ejemplo.
Andy

Respuestas:

9

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/currenty /cities/chicago/restaurantssean 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?

Waxwing
fuente
Me estoy inclinando hacia esto también. Como dice en su último punto, si tengo una propiedad de clase que es (digamos) un objeto Usuario, no la convertiría en una propiedad de matriz para cierta coherencia percibida.
Diego Barros
¿Cómo diferencia entre /users/currenty el usuario cuya ID (posiblemente nombre de inicio de sesión) es "actual"?
TrueWill
1

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.

Geerten
fuente
Su punto de vista sobre que está en el mismo formato, por lo tanto, se analiza de la misma manera cada vez tiene mucho sentido.
Diego Barros
Aunque, la biblioteca que estoy usando analiza el JSON para mí y maneja si el JSON es una matriz o un objeto único.
Diego Barros
Pero entonces el código que está utilizando cualquier objeto que devuelve su biblioteca tiene que saber si el resultado es una matriz o un solo objeto.
Geerten
Estoy usando RestKit, que llama a la devolución de llamada delegada apropiada dependiendo de si se trata de una matriz o un solo objeto: - (void) objectLoader: (RKObjectLoader *) objectLoader didLoadObjects: (NSArray *) objetos o - (void) objectLoader: (RKObjectLoader * ) objectLoader didLoadObjects: (id) objeto. Lo cual es una buena manera de hacerlo.
Diego Barros
De hecho, esa es una buena manera de hacerlo, sin embargo, no todos podrían usar una forma tan sofisticada ...
Geerten
1

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.

Scarfridge
fuente
-1

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.

usuario1270717
fuente
Para mí, el JSON representa un objeto (que es). Entonces, si estuviera creando clases (en su lenguaje de programación favorito), digamos que tenía una clase de inicio de sesión que tiene una propiedad CurrentUser, no haría que esa propiedad sea una matriz que contenga un solo objeto de usuario. Obtendría el usuario actual con Login.CurrentUser, y no Login.CurrentUser [0]. ¿No solo tendría que verificar una propiedad CurrentUser nula, sino también verificar la longitud de la matriz?
Diego Barros