是否有任何支持多种请求类型的 MVC Web 框架?

Posted

技术标签:

【中文标题】是否有任何支持多种请求类型的 MVC Web 框架?【英文标题】:Are there any MVC web frameworks that support multiple request types? 【发布时间】:2010-09-12 01:20:32 【问题描述】:

在我尝试过的每个 MVC 框架(Rails、Merb、Waves、Spring 和 Struts)中,请求(和响应)的概念都与 HTTP 的请求概念相关联。也就是说,即使有一个作为 Request 超类的 AbstractRequest,AbstractRequest 也有诸如标头、请求方法(GET、POST 等)以及与 HTTP 相关的所有其他内容。

我想通过 SMS、Twitter、电子邮件或任何其他我可以为其制作适配器的媒体来支持请求-响应循环。有没有一个框架做得特别好?

我想到的唯一其他选择是创建,例如,一个 Twitter 轮询器,它在单独的线程中运行并将消息转换为本地 HTTP 请求,然后将响应发送回。

如果有一个适用于多种请求媒体的良好框架,路由会是什么样子?在 Rails 中,HTTP 路由看起来像这样:

map.connect 'some/path/with/:parameter_1/:paramter_2', :controller => 'foo', :action => 'bar'

Twitter 或 SMS 路由看起来如何?正则表达式匹配关键字和参数?

【问题讨论】:

【参考方案1】:

我一个都没见过。问题是请求也与主机绑定,响应与请求绑定。

因此,如果您通过电子邮件收到请求,并且控制器说要呈现“关于我们”的视图,则您需要 MVC 框架知道如何:

首先获取请求 - MVC 框架几乎需要成为主机(IIS 不会收到有关新电子邮件的通知,那么您的电子邮件轮询代码是如何被触发的?) 允许灵活的路由匹配 - 通过路径/url 匹配并不适用于所有人,因此需要特定于请求的控制器路由 使用 aboutus email 视图而不是名为“aboutus”的 SMS 或 HTTP 视图 通过电子邮件将回复发送给正确的收件人

Web MVC 框架无法解决问题 - 您需要一个能够通过 Web、短信、电子邮件等方式处理激活的 MVC“主机”。

【讨论】:

我不介意编写将请求添加到 MVC 处理队列的小轮询线程,但我见过的大多数框架并没有真正公开该队列(如果它甚至是多线程的)。任何解决方案都需要插件,因为新类型一直在添加。【参考方案2】:

Java Servlet 规范旨在使 Servlet 保持协议中立,并以特定于协议的方式进行扩展 - HttpServlet 是特定于协议的 Servlet 扩展。我一直认为 Sun 或其他第三方框架提供商会提出其他特定于协议的扩展,例如 FtpServlet 或 MailServlet,或者在本例中为 SmsServlet 和 TwitterServlet。

相反,人们要么完全绕过了 Servlet 框架,要么在 HTTP 之上构建了他们的协议。

当然,如果您想为所需的协议实现特定于协议的扩展,则必须开发整个堆栈 - 请求对象、响应对象、识别会话的机制(例如在 SMS 中使用 MSISDN而不是 cookie),一个模板和渲染框架(相当于 JSP)——然后在它之上构建一个 MVC 框架。

【讨论】:

【参考方案3】:

您似乎主要使用 Java 和/或 Ruby,所以请原谅我这个答案是基于 Perl :-)。

我非常喜欢 Catalyst MVC 框架 (http://www.catalystframework.org/)。它通过引擎将请求的实际映射(一般意义上的)委托给代码。诚然,目前所有的引擎类都是基于 HTTP 的,但我一直在尝试编写一个不基于 HTTP 的引擎类(或者可能与 Twitter 之类的东西相关联,但与 HTTP 交互分离) Twitter 使用)。至少,我确信它是可以做到的,即使我还没有开始尝试。

【讨论】:

在我看来,一个 Catalyst 实例只能绑定到一个引擎。也就是说,您可以拥有 CGI Catalyst 或 FCGI Catalyst 或 Apache Catalyst,但您不能有多种方式来提供同一个实例。不一定是问题 - 可以使用相同的数据库返回。【参考方案4】:

您可以在您的网站上实现REST-based 适配器,它会根据输入参数替换模板并重定向。

api.yourhost.com 上的所有请求都将由基于 REST 的适配器处理。

此适配器允许以编程方式调用您的网站,并以可解析的格式生成结果。

实际上这意味着:它用自己的模板引擎替换模板,这会发生:

调用通用 xml/json 模板而不是分配的模板,它只输出一个包含所有模板变量的 xml

然后您可以制作您的 Twitter Poller、SMS 网关,甚至可以从 javascript 调用它。

【讨论】:

以上是关于是否有任何支持多种请求类型的 MVC Web 框架?的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC常见面试题总结

快速上手业界主流 Web 框架 Spring MVC,拒绝低效搬砖

Java 开发基本技能:快速上手主流 Web 框架 Spring MVC

Java框架之SpringMVC 03-RequestMapping-请求数据-响应数据

SpringMVC的一个小整理

SpringMVC ------JstlView