哪个端点应该表示与非相关元素的多对多关系

时间:2016-09-09 06:58:26

标签: rest restful-architecture restful-url

很难将问题扼杀到一行,但我希望我能在这里更好地解释自己:

我有以下型号:

用户

      
  • ID

讯息

      
  • ID

代码

      
  • ID

UsersMessagesCategories

      
  • ID
  •   
  • 用户id
  •   
  • MESSAGEID
  •   
  • TAGID

Tagsuser创建 NOT ,可通过管理面板创建tags

我想创建一个端点,为tags返回 avaliable message但是已经与user关联的那些端点返回到message 已标记

我似乎无法找到Rest标准的方法来实现这一目标。

PS:为了说清楚,我想:

{
   tags:[
     {id: 1, associated: false},
     {id: 2, associated: true},
     {id: 3, associated: false}
   ]
}

或许方式是:

{
   tags:[
     associated:[
       {id: 2},
       {id: 1}
     ],
     unassociated: [
       {id: 3}
     ]
   ]
}

我也不知道是否应该退回(我猜这就是那个):

/users/1/messages/1/tags

或通过:

/tags

甚至是:

messages/1/tags

编辑:更改了端点,以便使用多个名称构建URI。

2 个答案:

答案 0 :(得分:1)

为什么不试试/tags?user=X&message=Y之类的东西?据我所知,标签不是消息或用户的直接子节点,因此不需要在URL模式中直接使用子节点 REST没有定义访问资源的真实模式,所以你可以像我写的那样使用更像查询的GET参数,或者你可以像你提出的那样使用更像树的结构。
您可以做的最好的事情是通过类似的URL模式访问项目的每个REST资源,以使其更加用户友好。

您建议使用JSON格式化的第一个解决方案结果是我认为更好的

{
    tags:
    [
        {id: 1, associated: false},
        {id: 2, associated: true},
        {id: 3, associated: false}
    ]
}

但这也很大程度上取决于您如何为项目的其他REST服务建模。如果您愿意,还可以返回将标记与消息相关联的用户,以提高可读性。

答案 1 :(得分:1)

你可以选择(记住复数名称):

/users/:user-id/messages/:message-id/tags

假设标签可以在没有消息的情况下存在,您还可以支持端点返回所有可用标记:

/tags