在Groovy / Grails中设置新URL(...)。文本的超时

时间:2009-12-03 11:45:11

标签: grails groovy

我使用以下Groovy代码段来获取Grails应用程序中HTML页面的纯文本表示:

String str = new URL("http://www.example.com/some/path")?.text?.decodeHTML()

现在我想更改代码,以便请求在5秒后超时(导致str == null)。什么是最简单,最Groovy的方法来实现这一目标?

2 个答案:

答案 0 :(得分:6)

您必须以旧方式执行此操作,获取URLConnection,在该对象上设置超时,然后通过Reader读取数据

尽管(imho)添加到Groovy会是一件好事,因为这是我在某些时候可以看到的东西; - )

也许建议将其作为JIRA的功能请求?

我已将其作为RFE添加到Groovy JIRA上

http://jira.codehaus.org/browse/GROOVY-3921

所以希望我们会在未来的Groovy版本中看到它......

答案 1 :(得分:5)

我检查了groovy 2.1.8的源代码,下面的代码可用:

'http://www.google.com'.toURL().getText([connectTimeout: 2000, readTimeout: 3000])

处理配置图的逻辑位于方法org.codehaus.groovy.runtime.ResourceGroovyMethods#configuredInputStream

private static InputStream configuredInputStream(Map parameters, URL url) throws IOException {
    final URLConnection connection = url.openConnection();
    if (parameters != null) {
        if (parameters.containsKey("connectTimeout")) {
            connection.setConnectTimeout(DefaultGroovyMethods.asType(parameters.get("connectTimeout"), Integer.class));
        }
        if (parameters.containsKey("readTimeout")) {
            connection.setReadTimeout(DefaultGroovyMethods.asType(parameters.get("readTimeout"), Integer.class));
        }
        if (parameters.containsKey("useCaches")) {
            connection.setUseCaches(DefaultGroovyMethods.asType(parameters.get("useCaches"), Boolean.class));
        }
        if (parameters.containsKey("allowUserInteraction")) {
            connection.setAllowUserInteraction(DefaultGroovyMethods.asType(parameters.get("allowUserInteraction"), Boolean.class));
        }
        if (parameters.containsKey("requestProperties")) {
            @SuppressWarnings("unchecked")
            Map<String, String> properties = (Map<String, String>) parameters.get("requestProperties");
            for (Map.Entry<String, String> entry : properties.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
        }

    }
    return connection.getInputStream();
}