Estoy buscando una manera más idiomática, si es posible, para escribir el siguiente código clojure:forma idiomática para escribir la función de interoperabilidad .NET
(import '(System.Net HttpWebRequest NetworkCredential)
'(System.IO StreamReader))
(defn downloadWebPage
"Downloads the webpage at the given url and returns its contents."
[^String url ^String user ^String password]
(def req (HttpWebRequest/Create url))
(.set_Credentials req (NetworkCredential. user password ""))
(.set_UserAgent req ".NET")
(def res (.GetResponse req))
(def responsestr (.GetResponseStream res))
(def rdr (StreamReader. responsestr))
(def content (.ReadToEnd rdr))
(.Close rdr)
(.Close responsestr)
(.Close res)
content
)
Este es el ClojureCLR y obras. (El hecho de que se trata de la variante CLR no importa mucho)
me gustaría deshacerse de las defs (sustituir por le deja? Pueden referirse unos a otros?)
¿Qué tal una manera mejor para llegar a la transmisión, teniendo en cuenta que ... el encadenamiento no funcionará porque necesito cerrar las transmisiones más adelante.
EDITAR: Después de la respuesta, encontré una manera mucho más fácil en .NET para descargar una página web usando la clase WebClient. Todavía utilizado muchos de los enfoques recomendados de Michal - sólo quería grabar lo que ahora creo que es la mejor respuesta:
(defn download-web-page
"Downloads the webpage at the given url and returns its contents."
[^String url ^String user ^String password]
(with-open [client (doto (WebClient.)
(.set_Credentials (NetworkCredential. user password "")))]
(.DownloadString client url)))