2017-12-02 22 views
0

私のWebクライアント(cljsで書かれています)は、いくつかのサードパーティのAPI呼び出しを行う必要があるバックエンド(cljで書かれています)に接続します。それはサーバー上で行われなければならず、結果は特定の方法で変換され、クライアントに返されます。ここでclojure/ringでhttpコールを行うにはどうしたらいいですか?

は、URLの

(defn get-orders [req] 
    (let [{:keys [sig uri]} (api-signature :get-orders)] 
    (client/get uri 
       {:async? true} 
       (fn [response] {:body "something"}) 
       (fn [exception] {:body "error"})))) 

代わりの{:body "something"}を返すの1のための私のハンドラだ、それは次のエラーを返して:私は間違って

No implementation of method: :render of protocol: #'compojure.response/Renderable found for class: org.apache.http.impl.nio.client.FutureWrapper 

何をしているのですか?

+0

の場合を支援するために、同時に複数のサードパーティのURLへの呼び出し、Webクライアントに一度戻る、promiseを使用したい場合はそう

(jetty/run-jetty app {:port 4000 :async? true :join? false}) 

ようtrue:async?フラグを設定しますFutureWrapperはJavaの未来であり、derefまたは@のどちらかを使用して逆参照しようとします。 –

答えて

2

{:async? true}と指定すると、clj-http.client/getは、FutureWrapperというエラーメッセージにa futureを返します。

したがって、非同期が必要ない場合は、使用しないでください。これは、サードパーティのurlを呼び出し、返された応答を返す同期リングハンドラの例です。

(defn handler [request] 
    (response {:result (client/get "http://example.com")})) 

あなたが本当にリングハンドラの非同期バージョンを使用して、非同期が必要な場合。

(defn handler [request respond raise] 
    (client/get "http://example.com" 
       {:async? true} 
       (fn [response] (respond {:body "something"})) 
       (fn [exception] (raise {:body "error"})))) 

asyncハンドラを使用するようにWebサーバーアダプタを設定することを忘れないでください。例えば、桟橋のために、あなたは

(defn handler [request] 
    (let [result1 (promise) 
     result2 (promise)] 
    (client/get "http://example.com/" 
       {:async? true} 
       (fn [response] (deliver result1 {:success true :body "something"})) 
       (fn [exception] (deliver result1 {:success false :body "error"}))) 
    (client/get "http://example.com/" 
       {:async? true} 
       (fn [response] (deliver result2 {:success true :body "something"})) 
       (fn [exception] (deliver result2 {:success false :body "error"}))) 
    (cond 
     (and (:success @result1) 
      (:success @result2)) 
     (response {:result1 (:body @result1) 
       :result2 (:body @result2)}) 

     (not (:success @result1)) 
     (throw (ex-info "fail1" (:body @result1))) 

     (not (:success @result2)) 
     (throw (ex-info "fail2" (:body @result2)))))) 
+0

このような詳細な回答ありがとうございます! – Bravi

関連する問題