什么是关于ASP.NET MVC的RESTful?
在过去的几年里,REST一直是如此stream行的stream行语,当ASP.NET MVC推出时,每个人都将REST与ASP.NET MVC相关联。 我也因为缺乏知识而哗然,我对REST的理解就是:
REST = SEO /用户友好的url
但是更多。 而且我对REST的了解越多,就越less地将ASP.NET MVC与它联系起来。 它比REST更接近WebForms。 所以事实上恰恰相反:
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 */
所以,而不是(也提供请求path的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方法不能用浏览器的请求来完成(这并不完全正确)。 所以现代的Ajax应用程序实际上可以是完全RESTful的。
Ajax是客户端技术,与ASP.NET MVC没有任何关系。 事实是,ASP.NET MVC可以作为一个完全的RESTful应用程序来完成。 实现它的手段(Ajax)并不重要。 (感谢Darin Dimitrov)
主要问题
为什么我们认为ASP.NET MVC是一个RESTful框架,特别是关于它的URL路由呢? 为什么他们没有定义默认的URL路由来执行 RESTfulness? 我不是在寻找争论的答案,而是那些真正回答这个问题的人 – 这种关系是如何进入人生的……也许我还不够聪明,仍然把这当作是我对这两方面知识的缺乏。
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
动作方法select器也将它理解为一个删除请求。 HTTP方法覆盖FTW!
没有什么能阻止你在ASP.NET MVC中使用HTTP / GET / PUT / POST / DELETE等resource/id
路由。 这不是默认的路由设置,但你可以做到这一点。
编辑(MLaritz – 添加达林的评论):ASP.NET MVC是一种服务器端技术,允许您暴露RESTful的URL。 他们消费的方式并不重要。 你问到为什么ASP.NET MVC被认为是RESTFul技术,答案是因为你可以很容易地暴露RESTFul网站的消费,就这么简单。
我认为很多讨论都与MVC之前的.NET Web堆栈的非RESTful有关,以及MVC如何使它在.NET平台上构buildREST风格的应用程序比ASP.NET MVC具有的任何特定的REST风格更容易。
没有URI风格让API变得宁静。
您问:“为什么我们将ASP.NET MVC视为一个RESTful框架,特别是将URL路由到它呢?”
因为REST被误解为关于URL而不是关于资源,标准接口和超媒体 。
这个链接可能会启发你在你的追求…简而言之,你可以像你描述的Url – 至less与MVC 2。
我只是认为有助于REST讨论使用PUT和DELETE。
一般来说,在REST和其他RESTful框架中,PUT和DELETE的问题不能通过resource/create
诸如resource/create
或resource/delete
URL来解决。 相反,这个动词是通过POST隧道传递的:
- 在HTML表单中传递一个隐藏的input,如
_method
。 - 使用JavaScript来执行PUT或DELETE
- 为了克服一些防火墙,您可能需要使用HTTP
X-HTTP-Method-Override
标头。
这是HTTP方法问题的通用解决scheme。
我没有告诉ASP.Net他们为什么不这样做,但是像/product/delete/1
这样的URL不提供RESTful资源。
编辑 :关于什么是REST似乎是必要的澄清一点。 从马的口中 :
REST API不应该包含任何通信协议的变化,除了填写或修正标准协议的未指定位的细节,如HTTP的PATCH方法或链接标题字段。 应该单独定义破坏的实现( 例如那些足够愚蠢的HTML浏览器定义HTTP方法集的浏览器 ) 的解决方法 ,或者至less在附录中进行定义,并期望该解决方法最终将被废弃。 [这里的失败意味着资源接口是特定于对象的,而不是通用的。]
强调我的。 REST没有被定义为使用四种HTTP方法。 它甚至没有被定义为使用HTTP。 它需要能够遵循超链接的通信协议。 它使用该协议,在不违反协议的情况下添加适当的定义。
在HTTP的情况下, 明确允许使用不实现PUT和DELETE的浏览器的解决方法。 第1点中的Rails方法显然是这样做的。
这个问题有点过时,现在(2014-08)的答案是这样的:ASP.NET MVC允许RESTful URLscheme,但不是这样devise的,这是默认的。 相反,ASP.NET MVC的成功之处在于更传统的MVC的Controller + Action风格。
现在编写RESTful服务的ASP.NET方式是ASP.NET Web API。 这使得使用匹配HTTP动词的方法命名约定创buildRESTful URLscheme变得更加容易。
请注意,一旦当前所谓的ASP.NET vNext不存在,这个答案就会过时,Web API和MVC将被合并为一个。
项目经理:“让我们开发完全RESTful的新项目!
其他程序员喊:“YYyyyyyy !!!”
-
几个星期后,在开发阶段:“先生,我们需要让客户端能够同时更新多行,因此我们需要做一个解决方法”
-
“先生,我只需要得到最新的发票”
-
“先生,我必须通过寻呼号码和大小!”
无赖。 为什么我们不都回到XML RPC