我已经创建了一个groovlet,它将充当一种HTTP代理。它接受GET请求,然后根据请求中提供的URL进行Web服务调用。
这是我到目前为止的代码:
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.0')
import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
String url = params.url
def http = new HTTPBuilder(url)
http.request(GET, TEXT) {
response.success = { resp, reader ->
println reader
}
response.'404' = { resp ->
println 'not found!'
}
}
我在groovlet的WEB-INF/lib
文件夹中有Groovy HTTPBuilder个JAR文件。但是,代码不能正常工作。 (我也尝试将文件夹放在$TOMCAT_HOME/common/lib
中,结果如下所示。)
当我完全按照上面的方式运行代码时,页面会完全空白。
如果我只删除顶部的@Grab
行(因为JAR理论上应该已经在类路径中了),我从Tomcat得到一个讨厌的错误(我在5.5上运行它,但我大致得到了6)上的相同行为:
HTTP状态500 - GroovyServlet错误: 脚本:'/ proxy.groovy':脚本 处理失败。启动失败: 语义期间的一般错误 分析:类型 org.apache.http.client.methods.HttpRequestBase 不存在 java.lang.TypeNotPresentException: 类型 org.apache.http.client.methods.HttpRequestBase 不存在......
然后是堆栈跟踪。
我的groovlet出了什么问题?
答案 0 :(得分:2)
两件事。
首先,似乎Groovlets不能使用Grape(@Grab
命令)。这就是当这条线存在时,groovlet无声地失败的原因。
其次,http-builder
模块还依赖于大约19个其他包(包括错误消息中引用的org.apache.http.client.methods.HttpRequestBase
)。您可以在~/.groovy/grapes
文件夹中找到这些包。
如果要查找所有依赖项,请删除Grapes目录。然后在本地运行使用该@Grab
命令的脚本。脚本执行完毕后,您可以查看Grapes目录并查看它下载的所有内容。
当我这样做时,我得到了以下包裹清单:
antlr
asm
commons-beanutils
commons-codec
commons-collections
commons-lang
commons-logging
net.sf.ezmorph
net.sf.json-lib
net.sourceforge.nekohtml
org.apache
org.apache.commons
org.apache.httpcomponents
org.codehaus.groovy
org.codehaus.groovy.modules.http-builder
xerces
因此,如果你想在groovlet中使用HttpBuilder,你需要在WEB-INF / lib或你的Tomcat common / lib目录中获取所有这些依赖项。
另一方面,如果您不需要任何非常花哨的东西,可以使用Groovy URL对象。请参阅some examples here。