什么是ASP.NET MVC如此RESTful?

时间:2010-09-16 20:59:38

标签: asp.net-mvc rest routing

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路由与它相关联?为什么他们没有定义到强制执行 RESTfulness的默认URL路由?我不是在寻找有争议的答案,而是那些真正回答问题的答案 - 这种关系是如何产生的......也许我仍然不够聪明,仍然认为这是因为我对这两者缺乏了解。

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动作方法选择器也将其理解为删除请求。 HTTP方法覆盖FTW!

7 个答案:

答案 0 :(得分:26)

没有什么能阻止你在ASP.NET MVC中使用HTTP方法GET / PUT / POST / DELETE来使用像resource/id这样的路由。它不是默认路由设置,但您可以这样做。

编辑(MLaritz - 添加达林的评论): ASP.NET MVC是一种服务器端技术,允许您公开RESTful URL。它们的消费方式并不重要。您询问为什么ASP.NET MVC被认为是RESTFul技术,答案是因为您可以轻松地公开RESTFul网址以供消费,就这么简单。

答案 1 :(得分:15)

我认为很多嗡嗡声更多地与.NET Web堆栈在MVC之前的非RESTful状态有关,以及MVC在.NET平台上构建RESTful应用程序的难易程度比任何特别的RESTful功能ASP.NET要容易得多MVC有。

答案 2 :(得分:12)

没有任何URI样式可以使API变得安静。

你问道,“为什么我们认为ASP.NET MVC是一个RESTful框架,特别是将它的URL路由与它相关联?”

因为REST被误解为关于URL而不是约resources, a standard interface, and hypermedia

答案 3 :(得分:5)

This link可能会启发你的任务......简而言之,你可以像你描述的那样拥有Urls - 至少在MVC 2中。

答案 4 :(得分:3)

我只是想参与有关PUT和DELETE使用的REST讨论。

通常在REST和其他RESTful框架中,通过创建resource/createresource/delete等网址无法解决PUT和DELETE问题。相反,动词通过POST隧道传送:

  1. 在HTML表单中传递隐藏的输入,例如_method
  2. 使用JavaScript执行PUT或DELETE
  3. 要克服某些防火墙,您可能需要使用HTTP X-HTTP-Method-Override标头。
  4. 这是HTTP方法问题的一般解决方案。

    我没有被告知ASP.Net说他们为什么不采用这种方式,但/product/delete/1之类的URL不提供RESTful资源。

    编辑:对于什么是REST似乎有必要进行一些澄清。 From the horse's mouth

      

    除了填写或修复标准协议的未指定位的详细信息(例如HTTP的PATCH方法或链接头字段)之外,REST API不应包含对通信协议的任何更改。破解实现的解决方法(,例如那些足以让人相信HTML定义HTTP的方法集的愚蠢的浏览器)应该单独定义,或者至少在附录中定义,期望解决方法最终会过时。 [这里的失败意味着资源接口是特定于对象的,而不是通用的。]

    强调我的。 REST未定义为使用四种HTTP方法。它甚至没有定义为使用HTTP。它需要能够遵循超链接的通信协议。它使用该协议,添加了合适的定义而不违反协议。

    对于HTTP,明确允许使用未实现PUT和DELETE 的浏览器的变通方法。第1点中的Rails方法显然就是这样。

答案 5 :(得分:2)

这个问题有点过时了,现在答案(2014-08)就是这样:ASP.NET MVC允许RESTful URL方案,但设计不是默认值。相反,ASP.NET MVC的成功之处是更传统的MVC的Controller + Action风格。

ASP.NET编写RESTful服务的方式现在是ASP.NET Web API。这使得通过使用与HTTP谓词匹配的方法命名约定来创建RESTful URL方案变得更加容易。

请注意,如果当前名为ASP.NET vNext的内容已经过时,此答案将会过时,其中Web API和MVC将合并为一个。

答案 6 :(得分:1)

项目经理:“让我们完全开发我们的新项目!!!”

其他程序员大喊:“YAyyyyyy !!!”

  1. 几周后处于开发阶段:“先生,我们需要让客户端能够同时更新多行,因此我们需要做一个解决方法”

  2. “先生,我只需要获取最新发票”

  3. “先生,我必须传递传呼号码和大小!”

  4. 长号。为什么我们都不回到XML RPC