2009-12-03 8 views
6

utilizo el siguiente fragmento maravilloso para obtener la representación de texto sin formato de una página HTML-en una aplicación Grails:.de ajuste de la nueva dirección URL (...) texto en Groovy/Grails

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

Ahora Quiero modificar el código para que la solicitud expire después de 5 segundos (lo que resulta en str == null). ¿Cuál es la forma más fácil y más maravillosa de lograr eso?

Respuesta

6

Habría que hacerlo de la manera antigua, para conseguir una URLConnection, estableciendo el tiempo de espera en ese objeto, entonces la lectura de los datos a través de un lector de

Esta sería una buena cosa que añadir a Groovy aunque (IHÓ), ya que es algo que podría ver que necesito en algún momento ;-)

¿Quizás lo sugiera como una solicitud de función en el JIRA?

he añadido como un RFE en el maravilloso JIRA

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

Así que espero que lo veremos en una versión futura de maravilloso ...

+0

+1: Muy bonito! Y con un parche: http://jira.codehaus.org/secure/attachment/46210/URL.text-timout.patch – knorv

+0

Aunque me gustaría poder pensar en una forma de prueba (sin requerir que la máquina de prueba tenga una conexión a Internet). , y sin necesidad de crear un sitio web deficiente cada vez que alguien ejecuta la prueba) ;-) –

+1

Solo una actualización, se ha publicado en Groovy. return new URL (url) .getText ([connectTimeout: 500, readTimeout: 5000]); – Ben

4

código fuente Revisé de maravilloso 2.1.8, por debajo de código está disponible:

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

La lógica para procesar mapa de configuración se encuentra en el método 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(); 
} 
Cuestiones relacionadas