【发布时间】:2011-04-13 10:42:51
【问题描述】:
REST 在过去几年(左右)一直是一个非常流行的流行语,当 ASP.NET MVC 推出时,每个人都将 REST 与 ASP.NET MVC 联系起来。我也很喜欢这种嗡嗡声,由于我缺乏知识,我对 REST 的理解只是:
REST = SEO/用户友好的 URL
但它远不止于此。我对 REST 了解得越多,我就越少将 ASP.NET MVC 与它联系起来。它当然比 WebForms 更接近 REST。所以事实其实恰恰相反:
REST ≠ SEO/用户友好的 URL
将默认路由定义为controller/action/id绝对不是 RESTful。
让我解释一下我对这种理解的问题。
如果 ASP.NET MVC 是 RESTful,我们不会将默认路由定义为:
controller/action/id
而是
resources/id /* that would have to use HTTP methods GET/PUT/POST/DELETE */
所以不要有(也提供带有请求路径的HTTP方法):
/product/index/1 /* GET */
/product/create /* POST */
/product/delete/1 /* POST */
/product/update/1 /* POST */
应该是(这里也提供了HTTP方法)
/products/1 /* GET */
/products /* POST */
/products/1 /* DELETE */
/products/1 /* PUT */
现在这将是 RESTful。 好消息是这实际上是可能的。如果你让它完全 RESTful,那也意味着你将必须使用 Ajax,因为 PUT 和 DELETE 方法不能用于仅浏览器的请求(这并不完全正确1)。因此,现代 Ajax 应用程序实际上可以完全是 RESTful。
Ajax 是客户端技术,与 ASP.NET MVC 没有任何关系。事实上,ASP.NET MVC 可以作为一个完全 RESTful 应用程序来完成。实现它的手段(Ajax)并不重要。 (感谢 Darin Dimitrov)
主要问题
为什么我们将 ASP.NET MVC 视为一个 RESTful 框架,尤其是与它的 URL 路由相关联?他们为什么不定义默认 URL 路由来强制 RESTful?我不是在寻找有争议的答案,而是那些真正回答问题的答案 - 这种关系是如何产生的......也许我仍然不够聪明,仍然认为这是我对两者缺乏了解。
1更新信息
实际上,您不必使用 Ajax 来实现完全 RESTful 架构。 Asp.net MVC 支持(从版本 2 开始)HTTP 方法覆盖,这意味着您可以使用浏览器表单发出 PUT 或 DELETE 方法。您所要做的就是添加一个额外的隐藏字段,例如:
<input type="hidden" name="X-HTTP-Method-Override" value="DELETE" />
Asp.net MVC 框架将能够将 POST 请求理解为 DELETE 请求,HttpDeleteAttribute 操作方法选择器也将其理解为删除请求。覆盖 FTW 的 HTTP 方法!
【问题讨论】:
-
超链接会导致 GET,而表单会提交 POST,因此除非用 AJAX 之类的东西替换它们,否则无法通过正常的浏览器操作使用 DELETE 和 PUT。
-
@Andrew:我在几分钟前的问题中也说过同样的话。我同意。
-
@Andrew,但这不一定是真的,是吗?我想你可以指定你的表单方法也可以是 GET ,对吧?
-
@DaveDev,不是浏览器限制。
-
@Robert & @Darin,所以如果是浏览器限制,你真的不能责怪 ASP.NET MVC 必须异步提交 DELETE 和 PUT 请求吗?
标签: asp.net-mvc rest routing