我正在尋找一種更地道的方式,如果可能的話,習慣的方法來寫下面的Clojure代碼:編寫.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
)
這是ClojureCLR和作品。 (事實上,它的CLR變種沒多大關係)
我想擺脫DEFS的(通過更換讓?他們可以稱呼對方?)
如何更好的方法要注意流 - 請記住,鏈接不起作用,因爲我需要稍後關閉流。
編輯:在答案後,我發現在.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)))