我在评论中的主张是,您违背了 MVC 范式中 RESTful 架构的目的,主要是关注“所有 AJAX 调用都转到一个控制器”。所以让我们把它分解成可用的东西,然后重建我们对为什么/如何的理解。
REST 只是表示代表性状态传输,但这不是我们所说的 REST 或 RESTful的意思。我们的意思是我们希望每个 URL 代表一种资源,并且我们使用动词来指示我们对每个请求所做的事情。所以“GET”、“POST”、“PUT”等都有一个目的,我们使用这个目的来决定我们如何与各个资源进行交互。
所以让我们把它放在眼里,让我们做点什么;考虑一个 HR 应用程序(这是人们采用的那些简单的应用程序之一)。我们有人员和部门。部门有一个 ID、一个名称和一个经理(他是一个人)。人们有一个 ID、一个姓名、一个经理(在我们的系统中可能是 -1 表示没有经理,或一个人的 ID)和一个电话号码。
当我们 HTTP GET http://server.domain/app/Person时,我们会得到一个所有人的目录,其中包含他们的姓名和 ID。
[ {Name: "Cole Brand", ID: 1}, {Name: "user341180", ID: 2} ]
当我们 HTTP GET http://server.domain/app/Person/1我们得到
{ Name: "Cole Brand", ID: 1, Manager: -1, "Phone Number": "222-555-1234" }
当我们 HTTP GET http://server.domain/app/Person/2我们得到
{ Name: "user341180", ID: 2, Manager: 1, "Phone Number": "222-555-6789" }
为了完整起见,列出部门列表:
HTTP GET http://server.domain/app/Department/
{ Name: "HR", Manager: 1 }
现在显然,我的示例有点枯燥,因为例如,员工肯定在一个部门工作,但我没有通过他们的个人资料将他们与该部门相关联。数据库肯定会跟踪它,但我们这里没有。这是一个简单的例子。
所以你可以从这里看到没有返回 HTML。我们将回到这一点。
对于下一部分,请注意我一直在使用 HTTP GET。如果我们使用 HTTP POST 会怎样?这意味着无论我们通过什么,都会覆盖该数据。所以让我举一个简单的例子:
HTTP POST http://server.domain/app/Person/2
send this data in the post body { Manager: -1, "Phone Number": "222-555-0089" }
get nothing in response (we could return the object, but my API doesn't for whatever reason, call it a specification deficiency)
当我们 HTTP GET http://server.domain/app/Person/2我们现在得到
{ Name: "user341180", ID: 2, Manager: -1, "Phone Number": "222-555-0089" }
看看我们如何使用 HTTP POST 来更新记录?这就是我们使用 RESTful 方法的方式,我们使用动词来表示动作。
那么我们还能用什么来与服务器通信呢?如果我们想让 RESTful 方法既返回网页又返回数据,但使用 GET 怎么办?我们可以使用 HTTP HEADER(可能是 X-Header?)来指定我们正在进行数据调用,因此默认情况下我们向 HTTP GET http://server.domain/app/Person/1发出请求,然后我们得到一个网页。如果您想要一个示例(提供网页的休息响应),请查看我们现在所在的页面。https://stackoverflow.com/questions/11061912/
<-- 实际上是由 MVC 宁静原则提供的(但我不认为他们通过这种方法提供 JSON,因为这不是他们的系统设置方式)。
所以我可能把你们都搞砸了,我只是想回顾一下 REST,以及我们今天如何将它用于 MVC 目的。让我们再看看其中的一部分,我们做http://server.domain/app/Person的部分
在 MVC 术语中,这意味着我们的应用程序中有一个 Person 控制器。对 Person 控制器发出的任何请求都将首先根据其动词类型进行路由,然后是任何其他参数。例如,提交此答案会发布到https://stackoverflow.com/questions/11061912/answer/submit
. 所以控制器知道它期望收到“发布 ID”(所以它知道答案所属的父级),“答案”告诉它我正在添加一个答案,然后“提交”它知道我是什么正在做。如果我正在编辑,它将是编辑提交而不是回答/提交。
好的,所以我觉得我让事情变得混乱了,我不知道您是否阅读了我在节点和一般 MVC 上的回答:模型如何与视图相关联?但让我澄清一下:控制器是一个路由设备,用于接收输入,将其发送到适当的模型,然后呈现一些视图(HTML、JSON、XML、纯文本等)。请注意,不需要渲染视图(还记得我在 HTTP POST 上没有返回任何内容的糟糕 API 吗?)。
因此,现在我们谈到了我之前在回复中试图表达的观点,但我仍然不够清楚。当您从“适当的资源”(在这篇文章 /question/ 中)移动方法时,您打破了一个 URL 根是一个资源的想法。哦,我把这一切都搞砸了不是吗?
在 REST 原则中,每个 URL 根是一个资源。您可以从该资源中执行操作,例如根据一些数据呈现某个视图,或者您可以使用某个动词添加/修改数据,或者如果这是您的风格,您可以制作烙饼。但是所有 Person 将始终位于http://server.domain/app/Person,而不是“有些人命令在http://server.domain/app/Person上,有些人命令在http://server 上。 domain/app/Department ”,因为那样你就会举起双臂然后去“我怎么知道在哪里可以找到人们的行动?!?!”
简而言之,这就是为什么您不想在一个控制器上放置一些用于访问数据的方法(呈现视图)以及在另一个控制器(JSON)上为相同的资源类型放置一些用于访问数据的方法。
既然我已经把所有的脑残都放到了一个帖子中,我对哪些部分感到困惑?随意编辑帖子并插入一些**what do you mean here?**
或**you seem to be jumping around on this point a lot**
任何您认为合适的内容。