【问题标题】:Restful design pattern for HTML用于 HTML 的 Restful 设计模式
【发布时间】:2015-10-27 08:07:30
【问题描述】:

我正在尝试为 both JSON 和 HTML 坚持 Restful 设计模式。我的问题是创建新资源的设计(除其他外,但这是问题的要点)。即:

JSON – POST to /resource creates a new resource.
JSON – GET to /resource returns a list of resources.
JSON – GET to /resource/{id} returns a resource.
HTML – POST to /resource creates a new resource.
HTML – GET to /resource returns a list of resources.
HTML – GET to /resource/{id} returns a resource.

到目前为止一切顺利——但我需要一个 HTML 表单来实际创建要发送到 HTML POST 的数据。显然 POST 和 GET 已经做了一些事情。我可以使用以下方法之一返回 HTML 表单:

HTML – GET to /resource?CREATE
HTML - GET to /resource?action=CREATE
HTML – GET to /resources/CREATE

但它们看起来像一个杂物,并不那么直观。 有什么想法或想法吗?

编辑 - 请参阅下面我对我的问题的回答。目前这是(我认为)最好的选择。

【问题讨论】:

  • 我不明白你的意思。您不需要 HTML 表单来执行 POST 请求。
  • 这是一个 HTML 应用程序(网页)。用户需要一个表单来输入数据以创建资源。与基于 JSON 的 API 不同,它已经拥有数据并将其简单地发布到 API。
  • @MarkUnwin,我宁愿添加一个名为/templates/ 的端点,它返回一个模板/表单/给定操作所需的任何内容。似乎服务器应该不知道这种形式的存在。它可以接受或拒绝请求,并且以适当的格式提交它是客户端的工作。
  • @Opal,最好将其作为答案(而不是评论)。就像你的想法一样 - 谢谢。
  • @MarkUnwin,添加了答案。你能澄清一下这个场景吗?

标签: html rest


【解决方案1】:

我确实会使用/resources/create 之类的东西。如果您想允许使用非数字标识符,那么这将不起作用。在这种情况下,您可以使用前缀标识资源,例如/resources/resource-{id},然后您仍然可以使用/resources/create

我发现这篇博文对做出 URI 方案决策非常有帮助:http://blog.2partsmagic.com/restful-uri-design/

【讨论】:

  • 感谢 Jeroen,我启用了 {id} 和 {name} 作为标识符,所以我倾向于 GET /resources?action=create。我只是不喜欢这一切 :-) 我阅读了链接的文章,但我也不喜欢 /resources/resource-{id} 的想法。这似乎是多余且不直观的。所有只是意见 - 谢谢你的意见。
【解决方案2】:

事实上,当您想在 RESTful 服务中处理多种格式时,您应该利用内容协商 (CONNEG)。

我的意思是:

  • 设置Content-Type标头指定发送数据的类型
  • 设置Accept 标头以指定要接收的数据类型

服务器资源应利用这些提示进行适当的数据转换。

在 JSON 的情况下,内容类型显然是application/json。对于 HTML 表单,您应该利用内容类型 application/x-www-form-urlencoded(或 multipart/form-data,如果您还想上传文件)。详情请见the specification

否则,您不应该在 URL 中使用操作,因为它不是真正的 RESTful。 HTTP 动词应该确定对资源执行的操作。我的意思是,要创建资源,应该使用POST 方法。 GET 方法旨在检索资源的状态。

有关更多详细信息,您可以查看此博客文章:

【讨论】:

    【解决方案3】:

    我有一个答案。我将使用来自 HTML 页面的标准 RESTful POST,但是当我没有发送表单参数并且我的接受标头是 text/html 时,我将向请求者发送 HTML 表单。保持 RESTful URI 设计并允许干净的 HTML 表单 + 流程(2 步)。

    HTML - POST - /resources (with no form attributes) generates a HTML form
    HTML - POST - /resources (with form attributes) adds a resource
    JSON - POST - /resources (with form attributes) adds a resource
    

    好的,它不是“严格”的 RESTful,因为我正在发布但没有创建新资源,所以理论上我应该为此使用 GET,但它是不匹配设计中最好的。

    如果有人能提供更好的解决方案,我仍然全神贯注:-)

    【讨论】:

      【解决方案4】:

      我宁愿添加一个名为/templates/ 的端点,它返回一个模板/表单/给定操作所需的任何内容。似乎服务器应该不知道这种形式的存在。它可以接受或拒绝请求,并且以适当的格式提交它是客户端的工作。

      我猜您将视图处理与准备 RESTful 端点混合在一起。后端站点应该完全不知道需要某种视图/表单这一事实。准备这样的表格是客户的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多