可能であれば、次の 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 バリアントであるという事実はあまり重要ではありません)
defs を取り除きたいです (let で置き換えますか? それらは相互に参照できますか?)
ストリームに到達するためのより良い方法はどうですか-後でストリームを閉じる必要があるため、チェーンは機能しないことに注意してください。
編集: 回答の後、.NET で WebClient クラスを使用して Web ページをダウンロードするはるかに簡単な方法を見つけました。私はまだMichalの推奨するアプローチの多くを使用しました.
(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)))