Création d'une relation d'entité dans REST: puis-je créer le parent en publiant sur un identifiant enfant?

9

Nous concevons actuellement une API REST pour accéder aux données client classiques. L'un des éléments de l'API sont les actifs d'un utilisateur. Les actifs sont ajoutés sous un service donné. L'API backend n'ajoutera un actif à un utilisateur que pour un service donné. Il n'y a donc pas de relation Utilisateur - Actif, mais une relation Utilisateur - [Service] - Actif.

Nos URI ressembleront à ceci:

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

Les utilisations de l'API connaîtront l'ID d'actif et l'ID de service pour créer une nouvelle entrée. Ce avec quoi nous nous débattons, c'est la création de cette relation.

Une façon simple serait de publier toute la relation avec /users/{id}/assets/

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

mais alors nous ne créons pas réellement un actif comme l'URI pourrait l'indiquer, mais une relation actif-service.

Comme alternative, nous considérons POST'ing à l'URI adressant la relation, comme ceci:

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

Mais dans ce cas, le chemin de ressource /users/{id}/assets/{id}n'existera pas avant le POST et sera créé comme effet secondaire.

Le POST sur un chemin de ressource qui n'existe pas encore est-il autorisé?

Merci pour vos pensées,

Gerard.

maasg
la source

Réponses:

3

Il semble que vous suggériez que, chaque fois qu'un utilisateur publie pour la première fois une relation inexistante, vous la créerez dans le cadre de la publication.

Si vous demandez si ce type de modèle de création sur accès est un modèle de développement valide et acceptable, la réponse est oui, il l'est - il est à la fois valide et un modèle assez courant à voir.

blueberryfields
la source
1
Merci d'avoir répondu. Y a-t-il des pointeurs vers une référence que je pourrais consulter?
maasg
2

Il y a plusieurs points ici: Premièrement: vous ne devez pas mettre l'ID lors de la création d'une nouvelle ressource car cet ID pourrait déjà exister, ou le système peut utiliser une technique spécifique pour générer l'ID et vous le forcez à utiliser le vôtre, et pour le proposer que l'id soit créé par le système l'attribut d'en-tête d'emplacement doit être défini en cas de ressource de création, pour récupérer le feed avec l'id généré.

Deuxièmement: votre JSON n'est pas correct, vous devez traiter le service comme un autre objet à l'intérieur de l'objet d'actif, comme dans les services URI de ressource, vous devez le traiter comme un tableau.

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

doit être:

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

Si vous allez utiliser de cette façon

Troisièmement: je ne préfère pas utiliser cette méthode pour la conception, si ce cas a échoué, comment pourriez-vous savoir qu'il a échoué lors de la création d'un actif ou d'un service,

Bassem Reda Zohdy
la source
0

Voici une ligne de pensée différente:

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

De cette façon, vous définissez les relations comme un lien à trois voies entre l'actif, le service et l'utilisateur et n'impliquez aucune relation hiérarchique

Vous pouvez ensuite récupérer une relation spécifique en:

GET /relationships?id="2144321"

ou recherchez un sous-ensemble de relations en:

GET /relationships?user="43434"

ou

GET /relationships?asset="12433"

La manière originale n'est pas fausse, mais cette approche peut vous donner plus de flexibilité sur qui elle sera utilisée.

Michael Shaw
la source