Sempre retornar objetos únicos em uma matriz para cargas JSON da API REST?

8

Para uma API REST em que estou trabalhando, desejo retornar o JSON em um layout consistente:

{
  "Data" : {
     "Id" : 123,
     "Email" : "[email protected]"
     "Firstname" : "Charlie",
     "Surname" : "Brown",
 },
 "Error" : null
}

A carga útil sempre conterá "Dados" e "Erro", onde um ou outro pode ser nulo.

Minha pergunta diz respeito a "Dados" e pontos de extremidade que realmente retornam apenas um objeto. Por exemplo, digamos que eu tenho uma API users/current, que retorna o usuário autenticado no momento. Eu teria retornado esse usuário como mostrado acima; um único objeto JSON chamado "Dados".

Para terminais que poderiam retornar zero, um ou mais objetos, eu (é claro) tornaria "Dados" uma matriz:

{
  "Data" : [
    {
      (first object)
    },
    {
      (second object)
    }
  ],
  "Error" : null
}

Ouvi um ponto de vista de que, por consistência, "Dados" sempre deve ser uma matriz. Mesmo quando um ponto de extremidade logicamente retornaria apenas um único objeto (ou nulo).

O que os outros pensam? Eu acho que não há necessidade de criar "Data" e array se nunca haverá mais de um objeto retornado.

Diego Barros
fonte
Eu pensaria que, se houvesse algum tipo de erro, você retornaria um código 400 ou 500 apropriado e enviaria qualquer detalhe no conteúdo. Retornar uma seção para dados parece estranho e possivelmente confuso, especialmente se você tiver dados E erros definidos no seu exemplo.
Andy

Respostas:

9

Eu acho que esse tipo de consistência é equivocado.

É improvável que agrupar os dados em uma matriz beneficie um consumidor de API, porque ele ainda precisará saber como interpretar os dados reais. Como exemplo, é pouco provável que os "dados" resultem /users/currente /cities/chicago/restaurantssejam manipulados pelo mesmo código.

Por outro lado, para erros, é provável que todos os erros sejam processados ​​pelo mesmo código de tratamento de erros e, em seguida, há um benefício em usar a mesma estrutura.

Pergunte a si mesmo: se essa era uma classe no seu idioma favorito de POO, você faria com que todos os métodos retornassem o mesmo tipo de consistência?

waxwing
fonte
Também estou inclinado a isso. Como você disse em seu último ponto, se eu tiver uma propriedade de classe que seja (digamos) um objeto Usuário, não a tornaria uma propriedade de matriz por alguma consistência percebida.
Diego Barros
Como você diferencia /users/currente o usuário cujo ID (possivelmente nome de login) é "atual"?
TrueWill 5/02
1

Se o lado receptor precisar de um destinatário geral para suas mensagens JSON, pode ser útil ter o nó de dados no mesmo formato. Portanto, nesse caso, é útil ter sempre uma matriz, para que possa ser analisada da mesma maneira sempre.

Se cada resposta for tratada individualmente (chamadas de API diferentes a partir de métodos diferentes), posso entender o seu ponto, no entanto , deve ficar absolutamente claro (a partir das chamadas de API) quando um array ou um objeto deve ser retornado.

Geerten
fonte
Seu ponto de vista sobre estar no mesmo formato, sendo assim analisado da mesma maneira todas as vezes, faz todo o sentido.
Diego Barros
Embora, a biblioteca que eu estou usando analise o JSON para mim e lide com o fato de o JSON ser uma matriz ou um único objeto.
Diego Barros
Mas o código que está usando qualquer objeto que sua biblioteca está retornando precisa saber se o resultado é uma matriz ou um único objeto.
Geerten
Estou usando o RestKit, que chama o retorno de chamada delegado apropriado, dependendo de ser uma matriz ou um único objeto: - (void) objectLoader: (RKObjectLoader *) objectLoader didLoadObjects: (NSArray *) objetos ou - (void) objectLoader: (RKObjectLoader * ) objectLoader didLoadObjects: (id) objeto. Qual é uma boa maneira de fazê-lo.
Diego Barros
Isso é realmente uma boa maneira de fazê-lo, no entanto nem todos podem usar uma forma sofisticada como bom ..
Geerten
1

Não sou fã da abordagem de matriz porque ela não oferece consistência verdadeira. Obriga o usuário do serviço a se perguntar sobre coisas como, o que acontece se houver mais de um objeto nessa matriz ou a se livrar do empacotamento matriz o mais rápido possível para essas matrizes singleton. Você ainda teria que fazer duas coisas diferentes.

No entanto, se você usar a matriz, verifique se Dados nunca é nulo. Se não houver dados, a matriz deve estar vazia. É a única vantagem que posso ver.

scarfridge
fonte
-1

Estou caindo do lado de sempre retornar uma matriz. No lado do cliente, eu uso meu objeto de resposta "Usuários", seja para obter todos os usuários ou apenas um. Se você tiver um ponto de extremidade que retorna matrizes e outro que retorna o mesmo objeto, mas nunca mais que um, ainda use uma matriz.

Existem argumentos semelhantes para usar a mesma lógica no lado do servidor; basta usar o mesmo código, independentemente de sua consulta estar retornando um item ou vários.

A única exceção seria ao retornar um objeto que nunca existe como uma matriz, em qualquer contexto, então não há necessidade.

user1270717
fonte
Para mim, o JSON representa um objeto (o que é). Portanto, se eu estivesse criando classes (na sua linguagem de programação favorita) - digamos que eu tivesse uma classe Login que possui uma propriedade CurrentUser - eu não faria essa propriedade ser uma matriz que contenha um único objeto Usuário. Gostaria de obter o usuário atual com Login.CurrentUser, e não Login.CurrentUser [0]. Não apenas precisaria procurar uma propriedade CurrentUser nula, mas também o comprimento da matriz?
Diego Barros