0

我创建了一个 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 的文件夹中有Groovy HTTPBuilder JAR 文件WEB-INF/lib。但是,代码无法正常工作。(我也尝试将文件夹放入$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 有什么问题?

4

1 回答 1

3

两件事情。

首先,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 对象。在此处查看一些示例

于 2010-06-09T17:40:25.907 回答