2016-01-10 3 views
1

Я пытаюсь сделать requiest к веб-сервиса, который требует данных в формате JSON и секрет (: ключ)Карта буквальным должно содержать четное число форм

(ns fdsfdsfds.core 
    (:require [clj-http.client :as client]) 
    (:require [clojure.data.json :as json])) 


(defn -main [& args] 
    (client/post "https://fsdfdsfd.com/api/fdsfds" 
    {:body {(json/write-str {:key "fdsfdsfdsfd"})}})) 

У меня ошибка:

Exception in thread "main" java.lang.RuntimeException: Map literal must contain an even number of forms 

Есть четное число из них.

ответ

6

Проблема здесь:

{:body { (json/write-str {:key "fdsfdsfdsfd"})  }} 
      ^-- single item  missing value? --^ 
     ^----- this is a map too 

Там нет ничего в паре с вызовом функции.

:body имеет карту как значение, но у вас есть только функция, а не возможный ключ для ее значения, или если это ключ, для нее нет значения.

Вы, вероятно, хотите, чтобы удалить внешние скобки карты и оставить:

{:body (json/write-str {:key "fdsfdsfdsfd"})} 

EDIT после комментариев:

Вы спрашиваете, почему example on the site использует карту. Внимательно посмотрите на используемую величину, это строка

(client/post "url://site.com/api" 
    {:basic-auth ["user" "pass"] 
    :body "{\"json\": \"input\"}" 
    ;; ... 

Карта состоит из линий пары ключ/значение. Первый -

key = :basic-auth, value = ["user" "pass"] 

Значение здесь представляет собой массив.

Вторая строка:

key = :body, value = "any old string" 

В этом случае строка сбежавший карта, то же самое, что будет возвращен из вызова json/write-str

+0

, как это исправить ?. –

+0

Я обновил свой ответ. Если вам нужно значение в элементе body на карте, вам не нужны скобки, связанные с вызовом 'json/write-str' –

+0

, почему не нужны внешние« {»и«} »? здесь https://github.com/dakrone/clj-http необходимо –