Получайте данные из api с помощью clojure и регистрируйте результат

#clojure

Вопрос:

Я очень новичок в clojure и знаком с java и PHP. Я назначил новое задание clojure для получения данных из внешнего API и выполнения некоторого процесса.

Это мой запрос API, и я попробовал его с помощью команды curl curl -i -X POST -H "Content-Type: application/json" -d "{"uid":"uId", "param":"1"}" http://localhost:8081/api/getData

результат — {«comp»:true ,»yUi»:»78.2555″,»xUi»:»4.5233″,»идентификатор»:»10″}

Я применил описанный выше процесс с помощью clojure, и мне нужно зарегистрировать эти возвращаемые значения.Не могли бы вы, пожалуйста, помочь мне сделать это с помощью clojure

Вот как я попробовал это

 (defn- get-data
  "api call"
  [uId]
  (try
    (log/info (trs "start process: {0}" (str "uid" uId )))
    (when-let [ui (client/post "http://localhost:8081/api/getData" {:form-params {:uid uId,:param "1"} :content-type :json })]
      (log/info (trs "get data: {0} {1} {2} {3}" (:comp ui) (:yUi ui) (:xUi ui) (:id ui))))
    (catch Throwable e
      (log/error "api call failed:" (.getMessage e)))))
 

Комментарии:

1. И в чем же проблема? Пожалуйста, добавьте ваше заявление о проблеме. С первого взгляда я бы предположил, что использование данных формы вместо тела json было бы проблематичным?

2. Было бы полезно знать, какую клиентскую библиотеку HTTP вы используете, мы не можем догадаться об этом только по псевдониму пространства client имен. Похоже, что использование client/post в коде совсем не совпадает с данной curl командой.

3. Команда curl отправляет данные в формате JSON, используя заголовок типа содержимого application/json. Неясно, какой http-клиент использует post, но, как правило, использование параметров формы приведет к другому и, вероятно, неправильному методу кодирования данных и типу содержимого, чем curl. Проверьте документацию для клиентской библиотеки на наличие заклинания для отправки данных в API, которое предоставит шаблон для отправки JSON с правильным заголовком.

4. Предполагая, что вы используете clj-http , вы, вероятно, получаете все тело ответа в виде одной строки. Вы можете попробовать принудительно передать ответ в JSON или структуру данных Clojure с :as json помощью или :as clojure , как показано здесь: github.com/dakrone/clj-http#output-coercion