为什么“do_GET”和完整的rails-style路由之间没有中间点?

时间:2011-01-02 06:26:27

标签: web-services jsonp dispatcher application-server thrift

我希望向网络公开一些服务。将存在具有基于jQuery的JavaScript代码的静态网页,其访问这些服务,并且还将存在可以访问这些服务的各种应用程序。 (或者没人会关心;这也很可能: - )

每个服务都可以很好地定义为一系列方法,这些方法对某些输入参数起作用,并返回一定数量的输出参数。其中大部分是REST,除了“身份”的概念 - 这些服务需要一些登录,而登录确实为您设置了允许您使用哪些服务的方法以及哪些特定实体的权限你被允许使用这些方法解决。

理想情况下,我希望使用JSONP公开服务,以便以跨站点方式轻松使用这些服务 - 这些静态Web应用程序不应该都必须从我的应用程序服务器的域中提供。 / p>

数据类型集是相当基本的 - varchar(255个字符),文本(8191个字符),id(32个字符,C样式标识符约束),double,long(在JavaScript中很难做到),bool, datetime,email(varchar匹配reges)和url(varchar匹配正则表达式)可能已经足够了很长时间。

如果可能的话,我希望使用可以在多线程核心上扩展的应用程序服务技术来实现这些服务 - 如今,24个线程是普通中端服务器的标准配置。坚持使用Python或Node.js会让我感到不安,因为他们缺乏线程支持。此外,我希望键入是静态的,因为我相信静态类型可以防止某类错误,这也可以与Python,Node.js,PHP和Ruby进行对话。

我也想在Linux上提供服务。这是一个非常严格的要求: - )

在静态语言世界中,实际上只有少数服务器框架或框架方法。有Mono的HttpListener。有Java的Jetty。还有其他几个。还有一些更深层次的框架,比我想要的更多 - J2EE,ASP.NET等(在动态世界中,你有Cake.PHP,Rails,Django等)

所以,在最好的世界中,我喜欢GET URL / foo / bar?arg1 = 2& arg2 = xyzzy要映射到我写的类型为foo的对象,方法栏,参数arg1和arg2类型为int和string(比如说)。我想要位于HTTP GET和对象方法之间的服务器粘合剂做两件事: 1)权限控制(每种方法可以有一个或多个必需的权限) 2)类型检查(每个参数应根据预期进行验证,并从URL字符串格式强制到本机典型) 一旦该方法返回一个或多个值(键/​​值对),胶水应该确保返回值也是根据规范,转换为正确的JSON,并应该注意如果抛出异常返回适当的错误结果在代码中。

我一直在寻找这种解决方案的高低,但我找到的所有解决方案都相当遥远。 JSP和ASP都是以HTML假设开始的 - 我通常会生成JSON,它不会与语法集成(温和地说)。 JSPX以及许多其他技术(HttpListener,CGI,Python Twisted,...)都停留在“do_GET”级别 - 没有派遣到对象,没有权限控制,没有类型检查。但是,所有更高级别的框架都会添加 lot ,并且通常会添加复杂的路由,这不是我需要的 - 并且通常不会执行权限检查,而是将其作为必须在每个函数实现中手动编写的东西。

我认为我能找到的最接近我想要的是Thrift。但是,它仍然没有进行权限检查,并且“PHP服务器”支持它似乎是一个愚蠢的PHP cli进程侦听端口80而不是与Apache集成,并且它没有设置为支持JSONP。

我错过了什么吗?是否有一些(最好是静态类型和多线程支持)服务器技术,它将进行类型检查和权限检查以及简单的对象方法调度,没有大量的其他障碍阻碍,并且可以调用(并响应)到)JSONP? 我应该延长Thrift吗?为每个方法添加权限约束将是一个相当大的扩展,但至少我得到了Thrift的其他支持。 (然后我必须添加JSONP支持,并且......)

2 个答案:

答案 0 :(得分:0)

  

是否有一些(最好是静态类型和支持多线程的)服务器技术,它可以进行类型检查和权限检查以及简单的对象方法调度,而不会妨碍其他方面的攻击

Scala(静态,演员用于线程/并发和调度,没有任何瑕疵)+ Thrift。

我相信最新的节俭有javascript支持(不确定JSONP)。

关于身份验证,请参阅我对this question的回答。

答案 1 :(得分:0)

在这个层面上确实没有任何好的框架。现有的框架要么太低(想想boost :: asio),要么太高(想想蛋糕,铁轨等)。最接近的选项可能是Erlang / WebMachine。我想这是因为大多数网络应用程序最终都有一套通用的高级需求,最终会迁移到任何Web框架中,从而将其提升到我想要的水平之上。 / p>