Criando um relacionamento de entidade no REST: Posso criar o pai postando em um ID filho?

9

No momento, estamos projetando uma API REST para acessar dados clássicos de clientes. Um dos elementos na API são os ativos de um usuário. Os ativos são adicionados sob um determinado serviço. A API de back-end adicionará apenas um ativo a um usuário em um determinado serviço. Portanto, não existe uma relação Usuário - Ativo, mas um relacionamento Usuário - [Serviço] - Ativo.

Nossos URIs ficarão assim:

/users/{id}/assets/{id}/services/{id}

Os usos da API conhecerão o ID do ativo e o ID do serviço para criar uma nova entrada. O que estamos lutando é com a criação dessa relação.

Uma maneira direta seria postar toda a relação com /users/{id}/assets/

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

mas, na verdade, não estamos criando um ativo como o URI pode indicar, mas uma relação serviço-ativo.

Como alternativa, estamos considerando o POST para o URI abordar a relação, assim:

POST /users/{id}/assets/{id}/service/{id}
{attribute1:"{var}", attribute2:"{var}"}

Mas, nesse caso, o caminho do recurso /users/{id}/assets/{id}não existirá antes do POST e será criado como efeito colateral.

POST'ing para um caminho de recurso que ainda não existe ainda é permitido?

Obrigado por seus pensamentos,

Gerard.

maasg
fonte

Respostas:

3

Parece que você está sugerindo que, sempre que um usuário postar pela primeira vez em uma relação inexistente, você o criará como parte da postagem.

Se você está perguntando se esse tipo de padrão de criação no acesso é um padrão de desenvolvimento válido e aceitável, a resposta é sim: é válido e é um padrão bastante comum de se ver.

blueberryfields
fonte
11
Obrigado pela resposta. Alguma dica para alguma referência que eu poderia consultar?
precisa saber é
2

Existem vários pontos aqui: Primeiro: você não deve colocar o ID ao criar um novo recurso, pois ele já pode existir, ou pode ser o sistema que usa uma técnica específica para gerar o ID e você está forçando-o a usar o seu e para o Se o ID precisar ser criado pelo sistema, o atributo do cabeçalho do local deverá ser definido no caso de recurso de criação, para obter o retorno com o ID gerado.

Segundo: seu JSON não está correto, você precisa lidar com o serviço como outro objeto dentro do objeto ativo, assim como nos serviços "URI" de recurso, você precisa lidar com ele como matriz.

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

tem que ser:

POST /users/{id}/assets    
{services:[{ attribute1:"var", attribute2:"var"}]}

Se você vai usar dessa maneira

Terceiro: não prefiro usar esse caminho para a proposta de design. Se esse caso falhou, como você poderia saber que houve falha ao criar um ativo ou serviço,

Bassem Reda Zohdy
fonte
0

Aqui está uma linha de pensamento diferente:

POST /relationships
{ relationship:${id}, asset:{id}, service:{id}, user:{id}, data:"some data" }

Dessa forma, você está defendendo os relacionamentos como um link de três vias entre ativo, serviço e usuário e não implica em nenhum relacionamento hierárquico

Você pode recuperar um relacionamento específico:

GET /relationships?id="2144321"

ou pesquise um subconjunto de relacionamentos por:

GET /relationships?user="43434"

ou

GET /relationships?asset="12433"

A maneira original não está errada, mas essa abordagem pode oferecer mais flexibilidade sobre quem é usado.

Michael Shaw
fonte