DSL实现用于REST服务路由和处理的业务规则

| 我希望ѭ0((http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html)可以用于处理REST服务的路由规则的设计用ѭ1来实现((http://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala)。 该REST服务将用作代理,因此外部应用程序可以访问防火墙内的服务,因为它将具有可根据每个REST服务的业务需求进行自定义的附加安全层。 因此,如果一个人想要访问他们的上课时间表,那么与您要查看某个人的笔录相比,安全性将较低。 我想要在DSL中实际去哪里获取信息,如何返回信息以及需要什么安全性的规则。 但是,第一个问题是如何基于DSL动态更改REST服务的路由规则,因为我试图创建一个不需要大量重新编译即可添加新规则的框架,而只需编写适当的脚本,然后对其进行处理。 那么,是否可以使用Scala中的Combinator Parser来实现DSL,从而允许JAX-RS(http://download.oracle.com/javaee/6/tutorial/doc/giepu.html)动态更改路由? 更新: 我还没有设计语言,但这是我想要做的:
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
(http://code.google.com / p / specs /),以便功能方面可以确定是否定期测试了它们的要求。 更新2: 当我开始进行设计时,我可能会直观地理解一些选项,但不知道为什么。今天,我意识到Groovy可能是更好的解决方案,原因是我可以使用元编程(http://www.justinspradlin.com/programming/groovy-metaprogramming-adding-behavior-动态/),那么我将能够使用Scala或Groovy动态使用所生成的路由。我不确定如何使Scala生成类(如果尚不存在)。 在Groovy以及其他一些语言中,如此处所示(http://langexplr.blogspot.com/2008/02/handling-call-to-missing-method-in.html),如果缺少方法,则可以动态地生成方法,此方法将存在,因此将丢失一次。 几乎我应该混合使用Groovy和Java来完成这项工作,但是结果可能是,某些代码在Scala中,而某些在Java中,用于路由REST服务。     
已邀请:
将问题分为两部分:   可以使用组合解析器实现DSL 是。有些事情无法使用组合器解析器甚至其他解析器来实现。例如,无法解析Perl本身(必须对其进行评估)。组合器解析器对于复杂的语言(例如Scala,它的编译器不是基于组合器解析器),或者您需要最高的性能(例如用于编译成千上万行代码的编译器),也不是特别好。 但是,如果您打算走极端,选择解析器将不是您的主要问题。对于一般复杂度的DSL,它们会做的很好。   这将允许JAX-RS动态更改路由 好吧,我不了解JAX-RS,但是如果可以使用它进行动态更改的路由,那么组合器解析器将能够提供所需的任何输入。 编辑 看到您的示例,我认为解析器组合器肯定足够。从他们的结果来看,我希望您可以动态创建BlueEyes活页夹-我还没有使用过BlueEyes,所以我不确定它们的动态性。 另一个选择是使用Lift。 Lift的活页夹是部分函数,​​可以按所有常用的方式组合使用-
f1 orElse f2
f1 andThen f2
等。我最初并不建议这样做,因为它最常用于会话,但是它具有RESTful我认为该模型是无状态的。 我不了解Scalatra,所以我不知道它是否适合这种情况。     

要回复问题请先登录注册