我已经有使用基于MVC的web应用程序的经验,最近开始阅读关于REST的文章。
但是,当重新考虑如何重构现有的不使用任何框架/模式的web应用程序来使用这两种模式时,却陷入了困惑。
因此,这个应用程序(完全是用PHP编写的)已经有了一个web,但是它并没有使用像MVC这样的模式(在许多地方,所有的东西都是不分关注点的)。
我已经知道了如何重构它以遵循MVC。(为来自web的请求编写控制器,将请求委托给与数据层交互的服务层,等等)。
我还希望为一些函数启用REST。
我认为服务层和数据层都会被使用。
但是我应该如何处理对Web和REST请求的请求?我是否应该使用单独的控制器-一个用于网络,一个用于休息?
另外,由于REST是无状态的,我应该如何处理状态(比如web接口所需的会话)?
发布于 2016-08-03 17:25:16
让我们假设,如果您讨论的是MVC设计,那么您谈论的是服务器端实现。(UI)控制器将接受请求,调用业务逻辑(模型),呈现视图并将其返回给客户端。
让我们假设,如果您讨论的是网站的REST版本,那么您将转移到部分客户端实现。您的客户机(大概在浏览器中)将接受请求,确定要调用(模型)的REST接口,并直接在客户机(浏览器)上呈现视图。
实现这一点的客户端框架有很多,比如AngularJS ReactJS、EmberJS,举几个JavaScript的例子。当您想以这种方式更新/重做网站时,您将现有的业务逻辑放入REST端点,并从您选择的新客户端框架中调用它们。毫无疑问,对于如何将客户端状态保持在所选的框架中,将有详细的建议。
您将面临的挑战将包括将业务逻辑分解为可以轻松序列化和有意义的响应。例如,您过去常常检索所有客户的所有数据,并显示所有客户的摘要或特定客户的详细信息,现在您需要两个独立的REST端点,一个用于汇总所有客户,另一个用于特定客户的详细信息。虽然这样的更改通常是对系统的一种改进,但它并不一定驱动您想要使用服务器端框架还是客户端框架。
客户端框架可能必须运行在任何浏览器或手机的网站,可能不适合高度复杂的网站。通过REST端点向世界公开的敏感数据可能不是一个好主意。另一方面,客户端框架可以使网站真正酷酷,如果做得好可能会提高响应能力,但添加客户端代码所需的总体努力可能等于网站复杂性和必须支持的不同客户平台数量的平方,所以请注意。
发布于 2016-08-03 18:02:50
?
为了清除一些事情,RESTful API(也称为服务)是让应用程序进行通信的一种方式。您创建一个服务,然后许多客户端可以向它提出请求。
什么是客户?这些都是很多东西,比如前端的web用户界面,报告引擎,发票系统,搜索等等。
因此,在您的示例中,您将为要向其发出请求的前端客户机构建一个RESTfull API服务。RESTful服务将通常以json的形式将数据发回。然后,客户端进一步处理该响应,并酌情显示。
这里要注意的一点是,是的,服务是无状态的,但是客户机不是。你的客户可以有会话和饼干。它必须将请求中的信息传递给服务,以便使用响应来更新状态。
因此,例如,客户端可以调用如下所示的路由:
/user/create //A POST request with all the information needed to create a user
/user/{:id}/profile //A GET request to find get the information needed for a
//user profile with whatever the id is.因此,RESTful API是应用程序通信的高级体系结构。
进入应用程序的一个步骤是使用MVC (以及MVP、MVVM等)创建关注的分离。这些模式提供了帮助,这样您就不会在视图中得到完全不同的部分和部分,而不是html。您将看到这在前端客户机中实现,因为服务并不只关心视图,而只关心数据(视图是MVC中的V)。
要分解MVC:
(M)odel -是一个或多或少用来保存数据的容器。它可以是一个user模型,也可以是一个更大的模型,比如profile,它有一个user、cart、payment等,它有一个已知的结构和元素,可能还有一些处理数据的方法。
(V)iew -是将信息显示给用户的方法(带有HTML的浏览器)。这可能是一个php页面,它接受上述模型并将其解析到页面的各个部分。这里有一点是很一致的,那就是这不应该包含太多的逻辑。收集到的数据大多是表示出来的。
(C)主管-安排申请。基于浏览器请求到达的位置,它知道从哪里获取信息来填充模型--在这种情况下,是对RESTful服务API的请求。然后将该模型输入视图,然后将其发送回用户浏览器。
创建RESTful服务的美妙之处在于,只要您可以通过http/https进行调用,它就可以存在于任何东西中,然后客户端也可以在任何地方。MVC用于管理用户如何与该API交互的客户端。
现在,关于PHP中的一个实现,请查看一些框架-- Laravel、codeignitor、symfony和yii (我已经使用了0%),看看是否符合您的需要。
注意,您可以在家里成长服务,然后为任何客户机选择一个框架--通常我是用PHP或Java构建我的服务(PHP有slimeframework和Java),然后选择我想在客户机中使用的任何热度(角度、响应、GO或更多PHP,希望不是Java )。
发布于 2016-07-30 20:54:49
如果REST和Web具有相同的功能,唯一的区别是传递的格式,则使用所请求的格式(请求路径上的.json或.xml后缀,而不是.html)来决定使用哪个视图格式化控制器操作生成的对象。在最初将web设计为RESTful应用程序的情况下,这将是最有效的。在流程和REST与web提出的请求有显著差异的地方,最好在同一个web应用程序中将两者分开,这样它们就可以共享共同的业务逻辑和数据模型元素。应用程序可以有一个用于控制器和视图的web和api名称空间,路径以/web/或/api/开头,这取决于哪个名称空间的控制器将处理该请求。
当谈到会话状态时,即使是web也应该努力在会话中存储尽可能少的状态,目标是将所有需要的状态存储在数据库或其他持久性存储中,或者作为路径的一部分(例如。与给定用户相关的页面具有路径中的用户ID )。会话通常只包含身份验证令牌(以验证用户身份验证是否正确)或他们所验证的用户名或ID等内容。如果REST是用身份验证请求设计的,它检查凭据并设置身份验证令牌,就像web登录操作一样,那么REST可能也需要这样做。
https://softwareengineering.stackexchange.com/questions/326059
复制相似问题