2015-07-11 6 views
1

Я получаю тело и заголовки из запроса, как это:Как я могу получить конкретный заголовок HTTP в запросе compojure

(POST "/api/item" {body :body headers :headers} (create-item body headers)) 

тело обертывают, так что я получаю ключевое слово карту и я могу легко принимать значения от что:

(def app 
    (-> (handler/api app-routes) 
     (middleware/wrap-json-body {:keywords? true}) 
     (middleware/wrap-json-response))) 

Как просто:

(:item-name body) 

Как я могу добиться того же с заголовками , или просто просто взять определенное значение заголовка? Нужно ли сначала сопоставлять заголовки в структуре данных Clojure?

Если я печатать заголовки я получаю что-то вроде этого:

({host localhost:3000, user-agent Mozilla/5.0}) 

ответ

2

заголовки уже в структуре данных Clojure. Если вы хотите получить представление о существующих типах данных, используйте prn вместо println, и вы увидите, что это хэш-карта со строками в виде ключей.

(:foo x) является ярлыком для (get x :foo). Для хэш-карты со строковыми ключами вы можете получить значение, например. (get headers "host"). Существует функция в clojure.walk, clojure.walk/keywordize-keys, которая превратит ключи структуры данных в ключевые слова, рекурсивно через вложенную структуру. ИМХО, это немного глупо, и лучше использовать get и строковые ключи в большинстве случаев.

+1

Теперь я смог прийти к решению, спасибо. Оказалось, что мне нужно '(get (first headers)« host »)', потому что заголовки входят в 'ArraySeq'. – alundy