다른 api호출을 할 때, clj-http 라이브러리를 많이 쓰게 되는데 사용하면서 안되었던 점/해결방법을 기록차 남긴다.

get 사용시, ‘‘:query-params’ 사용하기

:query-params 의 값으로 키워드로 이뤄진 맵을 썼더니, 동작을 안했다. 그래서 되는데로, request url에 str함수로 파라미터를 붙여서 쓰곤 했다. 알보고니 값을 키워드로 쓰면 안되고( 는 상관 없다.), 다음과 같이 스트링으로 쓰면 아주 잘 보내진다. 대부분 request내부의 맵이 스트링으로 넘어오기 때문에, 그대로 넘기면 된다.

;;[clj-http "2.2.0"]
;;[clj-http.client :as client]

;; 쿼리 파라미터 ?q=test 을 표현하고 싶었다.

(client/get request-url {:query-params {:q :test}}) ;; 이렇게 하면 앙 뎀

(client/get request-url {:query-params {:q "test"}}) ;; 이렇게 하면 잘 됨
(client/get request-url {:query-params {"q" "test"}}) ;; 이렇게 해도 잘 됨

응답을 json으로 받으려면?

다음과 같이 default-option같은 것은 만들어 두고, 다른 옵션과 함께 merge해서 쓰면 편리하다.

(def default-option {:accept :json
                    :content-type :json
                    :as :json})
;; option 없을 때
:body "{\n  \"result\": \"1.0.0.453\"\n}"

;; 있을때
:body {:result "1.0.0.453"}

;;최종
(client/get request-url (merge {:query-params {"q" "test"}} default-option)) ;; 이렇게 하면 잘 됨

기타

http를 요청하던 중에는 가끔 에러들이 나는데

...... :reason-phrase "Not Found" .......

이런 에러를 봤을 때는 http 요청이 잘못되었던 거, 다양한 이유가 있겠지만 url마지막에 “/”이 포함되었는지 확인해보자.