【问题标题】:Setting timeout for new URL(...).text in Groovy/Grails在 Groovy/Grails 中为新 URL(...).text 设置超时
【发布时间】:2009-12-03 11:45:11
【问题描述】:

我使用以下 Groovy sn-p 在 Grails 应用程序中获取 HTML 页面的纯文本表示:

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

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

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

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

    这将是添加到 Groovy 的一件好事(恕我直言),因为我可以看到自己在某些时候需要它;-)

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

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

    https://issues.apache.org/jira/browse/GROOVY-3921

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

    【讨论】:

    • 希望我能想到一种测试方法(不需要测试机器有互联网连接,也不需要在每次有人运行测试时敲打一些糟糕的网站);-)
    • 只是一个更新,它已在 Groovy 中发布。 return new URL(url).getText([connectTimeout:500, readTimeout:5000]);
    【解决方案2】:

    我查看了 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2014-01-31
      • 2013-09-12
      相关资源
      最近更新 更多