2017-02-08 13 views
0

У меня есть интерфейс на основе обратного кадра и попробуйте установить связь с моим сервером с помощью re-frame-http-fx. Кажется, что работает отправка и ответ. Тем не менее, я не могу понять, как разобрать тело JSON на карту Clojure на сервере.Проанализируйте тело JSON из HTTP-запроса (с кольцом и повторным кадром-http-fx)

Вот мой handler.clj как минимальный, как я мог бы получить: (? Карта)

(ns my.handler 
    (:require [compojure.core :refer [GET POST defroutes]] 
      [compojure.route :refer [resources]] 
      [ring.util.response :refer [resource-response]] 
      [ring.middleware.json :refer [wrap-json-response wrap-json-body]])) 

(defn json-post [request] 
    (let [body (:body request)] 
    (prn body) 
    body)) 

(defroutes routes 
    (GET  "/"  []  (resource-response "index.html" {:root "public"})) 
    (POST  "/post" request json-post) 
    (resources "/")) 

(def handler (wrap-json-response (wrap-json-body routes {:keywords? true}))) 

Насколько я понимаю, wrap-json-body промежуточного слоя следует заменить тело запроса на разобранной версии.

Однако выход я получаю от (prn body) в моем json-post обработчиком что-то вроде этого: #object[org.httpkit.BytesInputStream 0xda8b162 "BytesInputStream[len=41]"]

Если я пытаюсь что-то вроде (prn (:title body)) я получаю nil (хотя оригинальная карта поворачивал JSON-запрос содержит :title, а также орган запроса и ответа).

В запросе и ответе содержится правильный json. Запрос Content-Type правильно установлен на application/json (отправлено re-frame-http-fx). Длина буфера (41) также является правильной длиной тела по запросу.

У меня заканчиваются вещи, чтобы попробовать. Есть идеи?

+1

Можете ли вы попытаться сорвать поток ввода, чтобы увидеть, что в нем находится? И можете ли вы попробовать, не обернув ответ JSON? –

+0

Засорение входного потока дает мне необработанное тело запроса, которое содержит ожидаемый json. Я не пытался удалить кольцевое промежуточное ПО, потому что я наткнулся на решение (см. Ответ). Спасибо и извините за неприятности. – notan3xit

ответ

1

При исследовании вопроса далее я обнаружил, что моя ошибка приводит к ее результату. Это относится к dev-handler из шаблона повторного кадра, который я непросто опущен из моего минимального примера в вопросе.

я не понял, что это проблема, потому что приложение, кажется, начинается хорошо, даже если вы полностью удалить определение dev-handler из handler.clj, я предполагаю, потому что сервер инициализируется handler в server.clj в любом случае (и клиент не делает терпит неудачу).

Однако в project.clj шаблоне повторно кадра, следующий сконфигурирован для figwheel:

:figwheel {:css-dirs ["resources/public/css"] 
      :ring-handler my.handler/dev-handler} 

Это приводит к промежуточному программному обеспечению конфигурируется для handler не применяются к моим запросам, таким образом, не разворачивая тело JSon. Изменение либо определения dev-handler (то же, что и вопрос handler), либо конфигурация figwheel в project.clj (чтобы указать на handler вместо dev-handler) решает проблему.

Если кто-нибудь знает аргументы разных обработчиков в project.clj и server.clj, не стесняйтесь, дайте мне знать.