2016-05-14 5 views
1

ウェブサイトをスクラップしてログインする必要はありません。私はJsoupを使ってこれを行うことに決めました。私は適切にClojureのにこのコード行を「翻訳」のトラブルを抱えている:私のClojureのコードでクラスConnection.Responseを指定せずにオブジェクトにクラスを指定する

Connection.Response loginForm = Jsoup.connect("**url**") 
     .method(Connection.Method.GET) 
     .execute(); 

を、接続がセッションからのクッキーに私は必要なメソッドを欠いクラスjsoup.helper.HttpConnectを、持っています。

これまでのところ、私は、次の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)) 

答えて

5

問題は、あなたが->スレッドのマクロを使用する必要がありますdotoを使用しています:

(let [url "*URL*"] 
    (-> url 
     (org.jsoup.Jsoup/connect) 
     (.data "username" "*USERNAME*") 
     (.data "password" "*PASSWORD*") 
     (.method "Connection$Method/POST) 
     (.execute))) 

doto形式ですvoidを返すセッターのようなメソッドを提供するJavaオブジェクトをセットアップし、スレッドを使用できないようにする必要がある場合に通常使用されます。あなたはdoto、最後のメソッド呼び出しが、その最初の引数として与えられたオブジェクト(この場合はSomeClassオブジェクト)の結果を返しません見ることができるように

(let [obj (SomeClass.)] 
    (.setA obj 1) 
    (.setB obj 2) 
    (.execute obj) 
    obj) 

(doto (SomeClass.) 
    (.setA 1) 
    (.setB 2) 
    (.execute)) 

はに変換します。そのため、現在のコードでは、​​メソッド呼び出しのConnection.Response結果ではなく、Jsoup/connectメソッド(通知としてjsoup.helper.HttpConnect)によって作成されたオブジェクトが返されます。

は何が必要です:with*ではなくvoidthisを返すビルダーメソッドです

(-> (SomeClass.) 
    (.withA 1) 
    (.withB 2) 
    (.execute)) 

上記ねじ切り形態と等価である:

(.execute 
    (.withB 
    (.withA 
     (SomeClass.) 
     1) 
    2)) 
関連する問題