在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,该类缺少从会话中获取

我不想刮网站,这需要我登录。我决定使用Jsoup来完成这项工作。我无法将这行代码正确地“翻译”到Clojure:

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))