我希望Combinator parsers
,(http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html)适用于设计来处理使用Scalatra
实现的REST服务的路由规则,({{3} })。
此REST服务用作代理,因此外部应用程序可以访问防火墙内的服务,因为它将具有额外的安全层,可以根据每个REST服务的业务需求进行自定义。
因此,如果一个人想要访问他们的课程安排,那么安全性就会比你想要查看某人的成绩单时更少。
我想了解实际获取信息的规则,以及如何在DSL中返回信息,以及需要什么样的安全性。
但是,第一个问题是如何基于DSL动态更改REST服务的路由规则,因为我正在尝试创建一个不需要大量重新编译来添加新规则的框架,而只是编写适当的脚本,然后让它进行处理。
那么,可以使用Scala中的Combinator Parser实现DSL,这将允许JAX-RS(http://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala)动态更改路由吗?
更新
我还没有设计这种语言,但这正是我想要做的:
route /transcript using action GET to
http://inside.com/transcript/{firstparam}/2011/{secondparam}
return json encrypt with public key from /mnt/publickey.txt
for /education_cost using action GET combine http://combine.com/SOAP/costeducate with
http://combine.com/education_benefit/2010 with
http://combine.com/education_benefit/2011 return html
这是两种可能的想法,其中将成绩单请求的规则发送到不同的站点(例如防火墙内),并且数据被加密并返回。
第二个会更复杂,因为SOAP和两个REST请求的结果将被合并,并且需要有关于如何组合的其他命令,但是想法是将所有这些放在文件中可以动态解析。
如果我使用了Groovy,那么可以为路由生成一些新的类,这将删除一些性能命中,但我认为使用Scala将是最好的选择,即使我的性能受到了打击。
我希望建立一个更易于维护的框架,以便新的路由规则可以由不懂任何OOP或函数语言的人编写,但规范可以使用Specs
编写({{3因此,功能方面可以确定他们的要求是定期测试的。
更新2:
当我开始设计时,我可能会直观地理解一些选项,但不知道为什么。今天我意识到Groovy可能是一个更好的解决方案的原因是我可以使用元编程(http://download.oracle.com/javaee/6/tutorial/doc/giepu.html)生成路由类,然后我将能够使用Scala或Groovy动态使用生成的路由。我不确定如果它们尚不存在,如何让Scala生成类。
在Groovy中,以及其他一些语言,如此处所示(http://code.google.com/p/specs/)如果缺少某个方法,您可以动态生成该方法,它将在此后存在,因此它将丢失一次。
似乎我应该将Groovy与Java混合起来使其工作,但结果可能是某些代码在Scala中,而某些代码在Java中,用于REST服务的路由。
答案 0 :(得分:3)
将问题分成两部分:
可以使用Combinator Parser实现DSL
是。有些东西无法使用组合子解析器或其他类型的解析器来实现。例如,无法解析Perl本身(必须对其进行评估)。组合器解析器也不是特别适用于复杂语言(例如Scala - 它的编译器不是基于组合器解析器),或者如果你需要最高性能(例如用于编译数十万行代码的编译器)。
但是,如果你打算走极端,选择解析器不会成为你的主要问题。对于平均复杂度的DSL,他们会做得很好。
将允许JAX-RS动态更改路由
好吧,我不知道JAX-RS,但如果动态改变路由可以用它完成,那么组合器解析器将能够提供所需的任何输入。
修改强>
看到你的例子,我认为解析器组合器当然足够了。根据他们的结果,我希望你可以动态创建BlueEyes绑定器 - 我没有使用BlueEyes,所以我不确定它们有多动态。
另一个替代方案是使用Lift。 Lift的绑定器是部分功能,它们可以通过所有常用方式组合 - f1 orElse f2
,f1 andThen f2
等。我最初没有建议它,因为它最常用于会话,但是它有一个RESTful模型,我认为,是无国籍的。
我不知道Scalatra,所以我不知道它是否适应这一点。