2009-12-03 5 views
6

J'utilise le suivant extrait Groovy pour obtenir la représentation de texte brut d'une page HTML dans une application Grails.délai de réglage pour une nouvelle URL (...) texte Groovy/Grails

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

maintenant Je veux modifier le code afin que la demande expire après 5 secondes (résultant en str == null). Quel est le moyen le plus facile et le plus Groovy pour y parvenir?

Répondre

6

Vous auriez à le faire à l'ancienne, obtenir un URLConnection, définir le délai sur cet objet, puis la lecture des données par le biais d'un lecteur

Ce serait une bonne chose à ajouter à Groovy si (imho), comme c'est quelque chose que je pourrais me voir avoir besoin à un moment donné ;-)

Peut-être le suggérer comme une demande de fonctionnalité sur le JIRA?

Je l'ai ajouté comme RFE sur le Groovy JIRA

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

donc nous espérons que nous allons voir dans une future version de Groovy ...

+0

+1: Très bien! Et avec un patch: http://jira.codehaus.org/secure/attachment/46210/URL.text-timout.patch – knorv

+0

Je souhaite pouvoir penser à un moyen de tester (sans exiger que la machine de test dispose d'une connexion Internet) , et sans marteler un mauvais site chaque fois que quelqu'un fait le test) ;-) –

+1

Juste une mise à jour, il a été publié dans Groovy. return new URL (url) .getText ([connectTimeout: 500, readTimeout: 5000]); – Ben

4

J'ai vérifié le code source de 2.1.8 routinier, ci-dessous code est disponible:

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

La logique pour traiter la carte de configuration est situé dans le procédé 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(); 
} 
Questions connexes