代码之家  ›  专栏  ›  技术社区  ›  Luke Foust

使用层次结构对REST进行建模

  •  3
  • Luke Foust  · 技术社区  · 17 年前

    如何对分层资源进行建模?例如,假设一个人有一个“留言板”,而“消息”是一种资源。假设“消息”可以有回复,从而形成讨论 线 .如何对线程的概念进行建模?

    “信息”包括孩子吗?“线程”是自己的资源吗?最后,在这种情况下,什么样的REST URI可以工作?

    2 回复  |  直到 17 年前
        1
  •  1
  •   DaniCE    17 年前

    如果你认为对一条消息的所有回复也是消息,我会给每个回复一个id,并使用这些URI:

    #message {id}  (only the message, no replies)
    /messages/{id}
    
    #replies to the {id} message (a list of the id's of the replies)
    /messages/{id}/replies
    

    要创建新消息,请在uri中发布

     /messages
    

    若要创建对消息的回复{id},请发布到

    /messages/{id}/replies
    

    更新

    我将在这里修改我之前的答案。希望这次是以正确的休息风格。

    您有一个入口点uri,我们称之为{messages}。

    获取{消息}->所有消息的uri列表,{message1}、{message2}等。

    获取{message1}->使用message1文档进行响应,例如在xml中,它可能是:

    <message responses="{link to message1 responses}">
        <date>...</date>
        <body>...</body>
    </message>
    

    {链接到message1响应}是客户端必须遵循的链接,以获取响应的uri列表。

    例如,如果一条消息是对另一条消息的响应,它将包含在他的内容中

    <message responses="{link to message1 responses}" inResponseTo="{uri}" >
        <date>...</date>
        <body>...</body>
    </message>
    

    现在,要添加新消息,只需将其发布到原始的{messages}uri中。如果该消息是对其他消息的响应,只需在其内容中包含它(请注意,这是对初始答案的有效更改,您可以将回复发布到特殊的uri中)。

    要修改某些消息,请对其uri执行PUT。

    所有uri都可以遵循答案的第一部分,但这不是必需的。

        2
  •  1
  •   aehlke    17 年前

    到目前为止,每个响应都不是RESTful的。REST不需要是分层的。只需有一个入口点,如/threads/,它给出了每个线程资源的完整URI,每个线程资源都会用每个消息本身的URI或顶部消息加上其回复的URI等进行响应。只要这些URI可以通过入口点的超文本发现,其生成方式就无关紧要。