【问题标题】:Is www.example.com/post/21/edit a RESTful URI? I think I know the answer, but have another questionwww.example.com/post/21/edit 是 RESTful URI 吗?我想我知道答案,但还有一个问题
【发布时间】:2010-05-01 14:43:37
【问题描述】:

我几乎不敢发布这个问题,必须有一个我忽略的明显答案,但我开始了:

上下文:我正在创建一个用于教育目的的博客(想学习 python 和 web.py)。我决定我的博客有帖子,所以我创建了一个 Post 类。我还决定可以创建、阅读、更新或删除帖子(所以 CRUD)。所以在我的 Post 类中,我创建了响应 POST、GET、PUT 和 DELETE HTTP 方法的方法)。到目前为止,一切都很好。

我目前遇到的问题是一个概念性问题,我知道将 PUT HTTP 消息(带有已编辑的帖子)发送到 /post/52 应该使用 HTTP 的正文内容更新 ID 为 52 的帖子信息。

知道的是如何在概念上正确地提供 (HTML) 编辑页面。

会不会像这样:/post/52/edit 违反 URI 的概念,因为“编辑”不是资源,而是动作?

但另一方面,它是否可以被视为资源,因为所有 URI 将响应一个 GET 方法,它只会返回一个 HTML 页面?

所以我的最终问题是:如何以 RESTful 方式提供一个供用户编辑的 HTML 页面?

【问题讨论】:

  • 我建议不要在方法之后命名资源 - 发布到帖子会让人感到困惑。
  • @Ink-Jet:感谢您的意见。这可能令人困惑,但不应该如此。我认为将“帖子”视为资源是完全合理的。如果我没记错的话,根据 RFC2616 中的措辞,发布到“Post”将创建一个新的“Post”下属。

标签: python rest web.py


【解决方案1】:

另一种 RESTful 方法是使用查询字符串作为修饰符:/post/52?edit=1

另外,不要过于拘泥于 REST 模型的纯粹性。如果您的应用与模型不完全吻合,那就打破规则。

【讨论】:

  • 这就是我推荐的。这对我来说最有意义,因为GET /post/52 将向您显示资源的一种表示形式(“正常”版本),而GET /post/52?edit=1 将向您显示同一资源的另一种表示形式(可编辑的表单版本)。
  • 我建议a)在违反规则之前了解规则,b)知道违反规则的后果。没有 REST 规则说明您的 URL 应该是什么样子。
  • @Will 您描述的是两种不同的资源,而不是两种不同的表示形式。
  • @Darrell,在这里我不得不支持 Will,资源不是提供的 HTML 页面,它是一个底层概念资源。在这种情况下,“博客文章”,无论是查看还是编辑,都是一个资源。当然,这有点主观,人们在概念的应用上可能会有所不同。
  • @Ned 你是对的,资源不是构成所服务的 HTML 页面的字节,“资源”是由标识符 /Post/52?edit=1 表示的概念。但是,这与“/post/52”不同。请记住,URL 是不透明的,这些 URL 是不同的,并且资源应该只有一个返回 200 的 URL,否则会污染中间缓存。
【解决方案2】:

没有 RESTful URI 这样的东西。这是错误的概念,因为 URI 应该对客户端完全不透明。

如果它通过避免 URI 中的动词来帮助您正确实现 HTTP 统一接口,那很好,但不要受 URI 外观的限制。将资源建模视为数据建模类型是非常有限的。 RESTful 系统通常需要做的不仅仅是 CRUD 操作,因此您需要对系统中可用的资源有创意。

如果您创建一个 URL 并取消引用它会返回 200 状态代码,则该 URL 引用一个资源。如果您创建另一个 URL 并且它也返回 200,那么这是一个差异资源。

这意味着:

http://example.org/customer/10.xml
http://example.org/customer/10.json
http://example.org/customer/10?format=xml
http://example.org/customer/10?format=json

是 4 种不同的资源,并且

http://example.org/customers
http://example.org/customers?closed=true
http://example.org/customers?page=2&pagelength=20

也是不同的资源。

因此回答你的问题,如果你这样做了

GET /post/52/edit 

它返回一个200状态码和一个表示,那么它一定是一个资源。

【讨论】:

  • @Darrell,你应用资源概念有点不寻常。如果 ?format=xml 和 ?format=json 是不同的资源,您将什么视为同一资源的不同表示?来自wikipedia page:“REST 中的一个重要概念是资源的存在……为了操纵这些资源,网络的组件……交换这些资源的表示。”
  • @Ned 如果您查看 REST 论文中的表 5.1,您会看到 URL 和 URN 被描述为资源标识符。不同的 URL 指向不同的资源。您可以使用内容协商从同一个 URL 接收不同的表示,但是一旦您为这些“表示”提供不同的 URL,它们就会成为自己的资源。
  • @Ned 这是 Roy 在电子邮件中指出指向 xml 表示和 json 表示的 url 实际上是两种不同的资源。 tech.groups.yahoo.com/group/rest-discuss/message/13960
  • 资源的表示是 HTTP 消息的“接受”标头中的请求(根据 Darrel 提供的邮件列表链接)。感谢达雷尔花时间找到它。很高兴知道“/edit/”将是一种有效的方法,并且意识到您的观点,每个返回 200 OK 的 URI 都是一种资源,这对我来说是一种突破,即使它应该是显而易见的从头开始。感谢 Ned 和 Darrel 在这里所做的努力。
【解决方案3】:

与其叫它/post/52/edit,不如叫它/post/52/editor

现在它是一种资源。避免了困境。

【讨论】:

  • 这确实是“避免了困境”,我想过这样做。我只是认为这似乎是最简单的出路,也许不是概念上正确的出路。我会重新考虑。
【解决方案4】:

我不认为 /object/id/action 是 REST 规范的一部分。

您的编辑器会成为所有对象的通用工具吗?那么也许你的 URL 应该看起来像

/editor/object/id

action 是一个 HTTP 动词(GET,PUT,DELETE,POST),应该是 HTTP 请求的一部分,而不是 URL 的一部分。如需更好的总结,请查看RESTful_web_services 上的这篇维基百科文章。

【讨论】:

  • 请注意“帖子”是博客的重要组成部分。您在 URI 中看到的“post”是一种资源,而不是 HTTP 方法动词。也许我应该在我的问题中更清楚地说明这一点。
猜你喜欢
  • 2021-12-18
  • 2022-01-03
  • 2010-09-20
  • 2012-07-18
  • 1970-01-01
  • 2023-02-21
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多