【问题标题】:How to send HTML form RESTfully?如何以 RESTful 方式发送 HTML 表单?
【发布时间】:2010-11-17 18:41:59
【问题描述】:

我有一个称为“事实”的资源集合的 URI,以及该集合中每个“事实”资源的 URI。

我认为应该使用 GET 请求创建新“事实”的表单,但我无法确定应该使用哪个 URI。

对集合 URI 的 GET 应返回“事实”资源 URI 的列表。每个“事实”URI 都应将其内容作为对 GET 的响应返回。当然,实际的“事实”创建将是一个 POST(或 PUT,取决于具体情况)。

我看到了一些选项,但似乎没有一个令人满意:

  1. 添加“事实”URI 将引用的“事实形式”URI。对这个 URI 的 GET 给出 HTML 表单。仅仅为了描述一个资源而拥有另一个资源似乎是错误的。
  2. 在标题中不包含任何表单数据的“事实”URI 的 POST 将返回表单。然后在用户填写表单后,它将使用表单数据发布,并创建新的“事实”资源。这似乎是一种更糟糕的方法。
  3. 不要通过网络发送表单,而是将其作为 API 的一部分。这似乎是 RESTful 的,因为 REST API 应该描述媒体类型,并且可以从“事实”类型的描述中生成表单。这实现起来很奇怪。也许 REST 服务与常规网站是分开的,因此实际的 HTML 表单请求位于与 REST API 不同的某个 URI。
  4. 将 HTML 表单作为“事实”URI 响应的一部分。

为了澄清,我正在尝试遵循 Roy Fielding 指定的真正 REST 架构,而不是冒充 REST 的半生不熟的 RPC。

编辑:我开始认为#3 是在做某事。

edit2:我认为一种解决方案是以 CRUD 方式进行常规非 REST HTML 导航,然后前端进行适当的 AJAX REST 调用(或后端对其 REST API 进行内部调用)。

我需要正确执行此服务的 REST 部分的原因是我希望允许其他非 HTML 客户端稍后与之交互。

【问题讨论】:

    标签: html web-services architecture rest


    【解决方案1】:

    在我看来,唯一干净利落的 RESTful 答案是 1 和 3。

    在我看来,资源的描述是它自己的资源。问题是您是否希望通过应用程序的 API 访问此资源,或者是否希望将其作为 API 本身的一部分。

    对于 1,RESTful 使 URI 看起来像这样:

    GET /facts -> 所有事实 GET /facts/1 -> 返回事实 1(显然 id 可能是一个词或其他东西) GET /facts/create -> 返回适合创建事实的表单 POST /facts -> 添加一个事实

    【讨论】:

    • 但是描述是属于API的资源。因此,通过网络发送它们似乎不是 RESTful。
    • 我觉得需要把REST接口和HTML接口分开。 HTML 接口调用 REST URI,无论是通过 AJAX 从前端还是在服务器内部。而REST接口对HTML接口一无所知。
    • 我认为您不能断然地说“描述属于 API”。这种事情是一种设计选择。有时,在您编写 API 时,资源的描述可能并不完全清楚——请查看 CouchDB 以获取类似的示例。在您的情况下,我同意 API 是描述的最佳位置,然后您的 HTML 前端可以使用该 API。
    • HTML 定义了允许客户端动态构造实体的 FORM 元素这一事实对于媒体类型来说是完全有效的事情。我认为它没有违反任何 RESTful 约束。
    • 我同意 Chuck 的观点,即 1 和 3 是最佳选择。在不了解您的需求的完整范围的情况下,很难知道哪种方案最适合您的方案。关于解决方案 1,当您尊重统一接口约束时,有时您将不得不创建有点不自然的资源。但是,这些资源可以通过超链接发现,因此客户端是否执行 GET /Facts/Create 或 GET /Facts 并不相关。
    【解决方案2】:

    我认为你有点过于复杂了。 Web 浏览器并不是完美的 REST 客户端,因此您无法拥有完美的 RESTful 解决方案。在理想情况下,您根本不需要表单,因为网络浏览器会知道您的媒体类型并自行构建表单。

    同时,我建议您只使用大多数 REST 框架在资源上调用的附加“视图”来返回表单:
    例如。 /your/collectionresource?view=form,或/your/collectionresource;form

    【讨论】:

    • 后者是我在 1 中建议的 - 表单的完全不同的 URI。我不在乎 URI 本身是什么样子,这与 REST 无关。前者滥用查询,但可能有一些优点。
    • “滥用查询”是什么意思?这种方法有一些缺点吗?我想知道,因为这是我在这种情况下可能会使用的。
    • 查询应该用于请求某些资源集的子集,例如实际查询,而不是用于指定特定资源。
    • 我同意 Web 浏览器不是一个完美的 REST 客户端,但我不同意你不能使用一个完美的 RESTful 解决方案。 REST 风格是从使用 Web 浏览器的 Web 实现中提取的,因此根据定义,它必须是可能的。
    • 详细说明我的旧响应:一个缺点是查询字符串也可以防止缓存(我认为因为它表明预期响应不稳定)。
    猜你喜欢
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多