2017-12-02 10 views
0

내 웹 클라이언트 (cljs으로 작성)는 몇 번째 타사 API 호출을해야하는 백엔드 (clj으로 작성)에 연결합니다. 서버에서 수행해야하며 결과가 특정 방식으로 변환되어 클라이언트로 다시 전송되어야합니다.클로저/링에서 http 전화를 걸려면 어떻게해야합니까?

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

내가 잘못 뭐하는 거지 :

다음은 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"}를 반환

중 하나에 대한 내 처리기, 그것은 다음과 같은 오류를 반환?

+0

하면 도움 동시에 여러 타사 URL을 호출하고 웹 클라이언트에 한 번 돌아 promise을 사용하려면 너무

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

처럼 true:async? 플래그를 설정 FutureWrapper는 자바의 미래이며 deref 나 @를 사용하여 deref하려고 시도합니다. –

답변

2

{:async? true}을 지정하면 clj-http.client/get은 오류 메시지에 FutureWrappera 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"})))) 

비동기 처리기를 사용하도록 웹 서버 어댑터를 설정하는 것을 잊지 마십시오. 예를 들어, 부두를 들어,

(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