Je suis à la recherche d'une façon plus idiomatiques, si possible, d'écrire le code clojure suivant:façon idiomatiques d'écrire la fonction .NET Interop
(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
)
C'est ClojureCLR et travaille. (Le fait que c'est la variante CLR n'a pas beaucoup d'importance)
J'aimerais se débarrasser des defs (remplacer par permet? Peuvent-ils se référer les uns aux autres?)
Que diriez-vous d'une meilleure façon pour se rendre au courant - en gardant à l'esprit que ... le chaînage ne fonctionnera pas parce que j'ai besoin de fermer les flux plus tard.
EDIT: Après la réponse, j'ai trouvé un moyen beaucoup plus facile dans .NET de télécharger une page Web en utilisant la classe WebClient. Je encore utilisé plusieurs des approches recommandées de Michal - voulais juste enregistrer ce que je pense maintenant être la meilleure réponse:
(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)))