REST在过去几年(或左右)一直是一个流行的流行词,当ASP.NET MVC推出时,每个人都将REST与ASP.NET MVC联系起来。我也因为嗡嗡声而堕落,而且由于缺乏我的知识,我对REST的理解只是:
但它还有更多。我越了解REST,我就越少将ASP.NET MVC与它联系起来。它当然比WebForms更接近REST。所以事实恰恰相反:
将默认路由定义为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路由?我不是在寻找有争议的答案,而是那些真正回答问题的答案 - 这种关系是如何产生的......也许我仍然不够聪明,仍然认为这是因为我对这两者缺乏了解。
实际上,您不必使用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!
答案 0 :(得分:26)
没有什么能阻止你在ASP.NET MVC中使用HTTP方法GET / PUT / POST / DELETE来使用像resource/id
这样的路由。它不是默认路由设置,但您可以这样做。
答案 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/create
或resource/delete
等网址无法解决PUT和DELETE问题。相反,动词通过POST隧道传送:
_method
。X-HTTP-Method-Override
标头。这是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 !!!”
几周后处于开发阶段:“先生,我们需要让客户端能够同时更新多行,因此我们需要做一个解决方法”
“先生,我只需要获取最新发票”
“先生,我必须传递传呼号码和大小!”
长号。为什么我们都不回到XML RPC