如何RESTful发送HTML表单?

时间:2009-08-07 17:38:37

标签: html web-services architecture rest

我有一个名为'facts'的资源集合的URI,以及该集合中每个'fact'资源的URI。

我相信应该使用GET请求创建新“事实”的表单,但是我无法确定应该对其进行哪些URI。

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

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

  1. 添加“事实”URI将引用的“事实形式”URI。对此URI的GET提供HTML表单。似乎只有资源描述才有另一种资源。
  2. 对'fact'URI进行的POST而不在标题中包含任何表单数据将返回该表单。然后在用户填写表单后,它将使用表单数据POST,并创建新的“fact”资源。这看起来更糟糕。
  3. 不要通过电汇发送表单,而是将其作为API的一部分包含在内。这似乎是RESTful,因为REST API应该描述媒体类型,并且可以从“事实”类型的描述中创建表单。实施起来很奇怪。也许REST服务与常规网站是分开的,因此实际的HTML表单请求与REST API不同。
  4. 将HTML表单包含在“事实”URI响应中。
  5. 为了澄清,我正在努力遵循Roy Fielding所指定的真正的REST架构,而不是半生不熟的RPC作为REST。

    编辑:我开始认为#3正在发展。

    edit2:我认为解决方案是以CRUD方式定期进行非REST HTML导航,然后前端根据需要进行AJAX REST调用(或者后端对其REST API进行内部调用)。

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

2 个答案:

答案 0 :(得分:2)

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

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

对于1,似乎RESTful使URI像这样:

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

答案 1 :(得分:-1)

我认为你过分复杂了。 Web浏览器不是一个完美的REST客户端,因此您无法拥有完美的RESTful解决方案。在完美的世界中,您根本不需要表单,因为Web浏览器会知道您的媒体类型并自行构建表单。

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