【问题标题】:Modelling REST with hierarchy使用层次结构建模 REST
【发布时间】:2010-10-02 19:20:55
【问题描述】:

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

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

【问题讨论】:

标签: rest


【解决方案1】:

如果您认为对消息的所有回复也是消息,我会给每个回复一个 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

更新

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

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

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

GET {message1} -> 响应 message1 文档,例如在 xml 中它可能是:

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

{link to message1responses} 是客户端必须遵循的链接才能获取响应的 uri 列表。

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

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

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

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

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

【讨论】:

  • 我希望 /messages/{id}/replies 包含指向回复的链接而不是回复 ID——最好尽可能避免让客户端构建 URI。
  • 这是错误的。依赖 URI 命名约定与 REST 的所有内容背道而驰。您应该只有一个像 /messages/ 这样的入口点,它将整个 URI 提供给其响应中的其他消息资源,然后每个消息资源还应该向客户端发送每个回复消息资源的 URI 等。这一切都需要完成通过超文本。
  • 我没有提到它,但我认为 /messages 的 GET 将响应所有消息(或线程,这是一个设计决定)的列表。正如第一个推荐所说,这将更好地包含回复的 uri,因此客户端没有您所说的“URI 命名约定”
  • 我的回复只是关于如何在服务器中组织uris的建议。我知道的所有服务器休息库都强制执行这种层次结构。您没有给出任何关于如何回复消息的答案,因此您的回复不完整
  • 很公平。但与如何在超文本中呈现适当的响应相比,这是一个相当微不足道的问题,并不重要,听起来 OP 似乎不理解。他实际上特别询问了如何使他的资源成为 RESTful - 而 REST 与 URI 格式无关。即使他错误地询问“RESTful URIs”(这是一个不存在的概念),您的回答也是题外话。
【解决方案2】:

到目前为止,每个响应都不是 RESTful 的。 REST 不需要是分层的。只需有一个像 /threads/ 这样的入口点,它提供每个线程资源的完整 URI,每个线程资源将使用每条消息本身的 URI 或顶部消息加上其回复的 URI 等进行响应。只要可以从入口点通过超文本发现这些 URI,生成这些 URI 的方式并不重要。

【讨论】:

  • 澄清一下,如果要调用 API RESTful,则不能将 URI 定义为 API 的一部分。
  • 与其说一切都不是 REST,不如展示 REST 会是什么样子?
  • 哪一部分你不明白?如果你想让我向你解释 REST,我建议你阅读菲尔丁的论文。
  • 提供一个例子怎么样?
  • 如果你想了解 REST,stackoverflow 上已经有几个问题可以解决它。
猜你喜欢
  • 2013-02-21
  • 2017-09-25
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多