我正在使用Clojure和RESTEasy设计一个JAX-RS REST Server。
我的理解是,用Lisp系列语言编写的应用程序比用“传统”命令式语言编写的应用程序更多地被构建为“领域特定语言”。应用程序自下而上地设计为越来越多的“精炼”函数,直到在“顶层”,应用程序变成了对非常高级函数的一系列函数调用。
我正在尝试为我的REST服务器做这件事,从服务URL请求(GET、POST、PUT、DELETE)的资源类开始。
这是我的第一个资源:
(ns com.example.server.resources.buildtime
(:import [javax.ws.rs CookieParam GET Produces Path]
[javax.ws.rs.core Context Cookie NewCookie Response UriInfo]
[org.jboss.resteasy.annotations.providers.jaxb Formatted]))
(definterface BuildTime
(getBuildTime [^javax.ws.rs.core.UriInfo info
^javax.ws.rs.core.Cookie security-cookie]))
(deftype
^{Formatted true}
BuildTimeResource []
BuildTime
(^{GET true
Path "/buildtime"
Produces ["application/json"]}
getBuildTime
[this info security-cookie]
(.. (Response/ok "20111009") build)))当使用GET http方法在URL "/buildtime“处调用时,此资源以字符串(包含在JSON包中)的形式返回服务器构建时间。
我将编写更多的这些资源类和封装的方法(大多数类将有多个方法),每个类都有一个definterface和一个deftype。这似乎是宏的完美用法。
我正在征集关于如何作为DSL来做到这一点的建议。如何从领域特定语言的角度来思考呢?
发布于 2012-03-21 11:55:51
如果我要做这件事,我想我会从为RESTEasy创建一个环适配器开始。在此之后,Compojure将知道如何以一种与RESTEasy一起工作的方式来处理和响应http请求。这里有一些信息可以帮助你入门。
Ring是一个以标准方式表示http请求和响应的clojure库。本标准是详细的here。
它通过接收来自各种库中的任何一个的http请求(即,jetty、netty、finagle)并将其转换为标准表示。然后,它将请求交给请求处理程序(通常使用Compojure进行定义)。然后,处理程序返回一个响应(也在上面的规范中定义)。此响应通过环回转换为jetty、netty等可以理解的形式。
这种转换是由环适配器完成的。有一些列出的here,ring附带了内置的jetty适配器。也许您可以将它们中的一个用作创建RESTEasy适配器的模板。完成后,您可以以标准的方式使用compojure。
Ring和compojure是如何创建DSL的很好的例子。与所有优秀的DSL一样,它简化了在其问题域(本例中为HTTP服务器)中创建解决方案的过程。它们是如何从领域特定语言角度思考的很好的例子。如果你研究它们,你就能很好地从领域特定语言的角度思考问题。
https://stackoverflow.com/questions/7712179
复制相似问题