在clojure中指定对象的类
我不想刮网站,这需要我登录。我决定使用Jsoup来完成这项工作。我无法将这行代码正确地“翻译”到Clojure:在clojure中指定对象的类,clojure,jsoup,clojure-java-interop,Clojure,Jsoup,Clojure Java Interop,我不想刮网站,这需要我登录。我决定使用Jsoup来完成这项工作。我无法将这行代码正确地“翻译”到Clojure: Connection.Response loginForm = Jsoup.connect("**url**") .method(Connection.Method.GET) .execute(); 在Clojure代码中未指定类Connection.Response,该连接具有类jsoup.helper.HttpConnect,该类缺少从会话中获取
Connection.Response loginForm = Jsoup.connect("**url**")
.method(Connection.Method.GET)
.execute();
在Clojure代码中未指定类Connection.Response
,该连接具有类jsoup.helper.HttpConnect
,该类缺少从会话中获取cookie所需的方法
到目前为止,我已经提出了以下Clojure代码:
(import (org.jsoup Jsoup Connection
Connection$Response Connection$Method))
(do
(def url "*URL*")
(def res (doto (org.jsoup.Jsoup/connect url)
(.data "username" "*USERNAME*")
(.data "password" "*PASSWORD")
(.method Connection$Method/POST)
(.execute)))
(type res))
问题是您使用的是
doto
,您应该使用->
线程宏:
(let [url "*URL*"]
(-> url
(org.jsoup.Jsoup/connect)
(.data "username" "*USERNAME*")
(.data "password" "*PASSWORD*")
(.method "Connection$Method/POST)
(.execute)))
doto
表单通常在需要设置Java对象时使用,该对象提供类似setter的方法,返回void
,并阻止使用线程
(doto (SomeClass.)
(.setA 1)
(.setB 2)
(.execute))
翻译成:
(let [obj (SomeClass.)]
(.setA obj 1)
(.setB obj 2)
(.execute obj)
obj)
正如您所看到的,doto
不返回最后一个方法调用的结果,而是返回作为其第一个参数提供的对象(SomeClass
object)。因此,您当前的代码返回由Jsoup/connect
方法(Jsoup.helper.HttpConnect
)创建的对象,而不是Connection.Response
调用execute()
方法的结果
您需要的是:
(-> (SomeClass.)
(.withA 1)
(.withB 2)
(.execute))
其中带*的是生成器方法返回this
而不是void
上述螺纹形式相当于:
(.execute
(.withB
(.withA
(SomeClass.)
1)
2))
问题是您使用的是doto
,您应该使用->
线程宏:
(let [url "*URL*"]
(-> url
(org.jsoup.Jsoup/connect)
(.data "username" "*USERNAME*")
(.data "password" "*PASSWORD*")
(.method "Connection$Method/POST)
(.execute)))
doto
表单通常在需要设置Java对象时使用,该对象提供类似setter的方法,返回void
,并阻止使用线程
(doto (SomeClass.)
(.setA 1)
(.setB 2)
(.execute))
翻译成:
(let [obj (SomeClass.)]
(.setA obj 1)
(.setB obj 2)
(.execute obj)
obj)
正如您所看到的,doto
不返回最后一个方法调用的结果,而是返回作为其第一个参数提供的对象(SomeClass
object)。因此,您当前的代码返回由Jsoup/connect
方法(Jsoup.helper.HttpConnect
)创建的对象,而不是Connection.Response
调用execute()
方法的结果
您需要的是:
(-> (SomeClass.)
(.withA 1)
(.withB 2)
(.execute))
其中带*
的是生成器方法返回this
而不是void
上述螺纹形式相当于:
(.execute
(.withB
(.withA
(SomeClass.)
1)
2))