Я ищу более идиоматический способ, если возможно, написать следующий код clojure:
(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
)
Это на ClojureCLR и работает.(тот факт, что это вариант CLR не имеет большого значения)
Я хотел бы избавиться от определений (заменить на let? Могут ли они ссылаться друг на друга?)
Како лучшем способе добраться до потока - помните, что .. цепочка не будет работать, потому что мне нужно закрыть потоки позже.
РЕДАКТИРОВАТЬ: После ответа я нашел гораздо более простой способ.NET для загрузки веб-страницы с использованием класса WebClient.Я все еще использовал многие из рекомендуемых Михалом подходов - просто хотел записать то, что, как я теперь считаю, будет лучшим ответом:
(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)))