Quando usar recursos aninhados em uma API RESTful

15

Eu tenho dois recursos: usuários e links.

Os usuários podem ter vários links associados a eles. Eu projetei minha API RESTful para que você possa alcançar os links associados a um usuário no seguinte URI:

/users/:id/links

No entanto, eu sempre preciso ter um URI para apenas links - às vezes eu posso querer todos os links, independentemente do usuário.

Para isso eu tenho:

/links

Isso soa bem? Tendo dois URIs para links?

Gostaria de saber se devo alcançar os links de um usuário com um URI, como:

/links/user/:id ou /links/?user=:id

Dessa forma, só tenho um recurso para links.

    
por Oliver Joseph Ash 18.02.2013 / 21:12
fonte

2 respostas

14

Não, não há nada de errado em ter vários recursos para a mesma "coisa", neste caso listas de links.

Recentemente, estávamos lutando com o mesmo problema. Nossa decisão foi ter todos os recursos onde não há uma propriedade strict para não serem aninhados. Em outras palavras, os links seriam modelados sob

/links -- all links
/links/:linkid -- a particular link

Em seguida, os filtros na coleção de links são expressos como parâmetros de consulta. Então, para obter os links de um determinado usuário, você usaria:

/links?user=/users/:userid

Isso também permite uma composição mais fácil dos filtros:

/links?user=/users/10&since=2013-01-01

E é fácil de entender conceitualmente - você tem uma coleção de itens e adiciona filtros a ela.

Dito isso, não há nada mais "RESTful" sobre essa abordagem do que qualquer outro esquema de nomenclatura URI. É apenas uma convenção que achamos legível e fácil para nós desenvolvedores entendermos e abraçarmos. REST não se importa com o que você coloca em seus identificadores de recursos.

    
por 18.02.2013 / 22:17
fonte
1

Então, minha preocupação é: / users /: userid / links retorna "links", MAS se o user_id não for identificado, isso deve retornar um 404.

No entanto

/ links? userid =: userid potencialmente retornaria uma lista vazia (essencialmente um 200) que provavelmente é um bug. E bem possível.

Embora ambos funcionem, o aninhamento oferece funcionalidades adicionais que você pode desenhar posteriormente.

    
por 23.11.2017 / 12:43
fonte