【发布时间】:2012-08-05 00:46:56
【问题描述】:
在 RESTful 应用程序中,我们如何区分“动作”和 HTTP 动词(GET、POST、PUT、DELETE)?
例如,据我了解,对资源 /products 的 GET 请求应返回所有产品的列表。对/products 的POST 请求应该会创建一个新产品。那么,用户如何请求用于创建产品的原始表单?我最初的响应是对同一 URI 的 GET 请求,但如上所述,它应该返回所有产品的列表 - 而不是用于创建产品的空白表单。
在我研究过的大多数框架中,这个问题是通过将“动作”作为 URI 的一部分来解决的。例如,对/products/create 的POST 请求将创建一个新产品,而对/products/create 的GET 请求将提供用于创建产品的空白表单。要获得所有产品的列表,将根据所讨论的框架向/products 或/products/get、/products/read 等发送GET 请求。这种方法解决了上面的歧义,但它与我读到的关于传统 REST 设计的内容相冲突。
【问题讨论】:
-
but it conflicts with what I've read about traditional REST design-- 为什么? -
@RobertHarvey:因为“动作”对于 HTTP 动词是多余的。如果在 URI 中指定了一个动作,那么您只需要两个动词(即
GET和POST)。 -
在纯 REST 环境中,您将访问资源,而不是操作。因此,要获取创建新产品的表单,您将在 /products/form URI 上发出
GET。然后,您可能会使用 Javascript 将表单转换为 JSON 请求,然后您将PUT发送到 /products。正如您已经指出的那样,它很少以这种方式工作,可能部分是出于方便的原因,部分是因为大多数 Web 资源通常没有充分利用 REST。 -
@RobertHarvey:如果我理解正确,您是说新产品的空白表单应该被视为它自己的资源(仅支持
GET方法),而不是而不是产品资源的操作? -
在 ASP.NET MVC 中,
POST动词由不同的控制器方法重载支持,该方法在提交时接受表单数据。
标签: api model-view-controller http url rest