clojure освободитель - возвращение JSON из запроса пут
Я изо всех сил, чтобы вернуть JSON из пут! запрос:
Мой код выглядит так:
(defn body-as-string [ctx]
(if-let [body (get-in ctx [:request :body])]
(condp instance? body
java.lang.String body
(slurp (io/reader body)))))
(defn orbit-world [dimensions ctx]
(let [in (json/parse-string (body-as-string ctx))]
(json/generate-string in)))
(defn init-world [params]
(let [dimensions (Integer/parseInt params)
world (vec (repeat dimensions (vec (take dimensions (repeatedly #(rand-int 2))))))]
(json/generate-string world)))
(defresource world [dimensions]
:allowed-methods [:get :put]
:available-media-types ["application/json"]
:available-charsets ["utf-8"]
:handle-ok (fn [_] (init-world dimensions))
:put! (fn [ctx] (orbit-world dimensions ctx)))
Я просто хочу вернуть все, что передано запросу put, обратно в виде JSON, пока не пойму, что происходит.
Но если я сделаю запрос пут, я получу следующий ответ:
HTTP / 1.1 201 Создано
Дата: вс, 18 мая 2014 15:35:32 GMT
Тип контента: текст / обычный
Длина контента: 0
Сервер: Jetty(7.6.8.v20121106)
Мой запрос GET возвращает JSON, поэтому я не понимаю, почему запрос PUT не является /
1 ответ
Это происходит потому, что успешный запрос PUT не возвращает код состояния http 200 (по крайней мере, по словам освободителя), он возвращает код состояния http 201, как видно из ответа. Liberator обрабатывает код состояния http, каждый в своем обработчике. Чтобы добиться того, чего вы хотите, вы должны сделать:
(defresource world [dimensions]
:allowed-methods [:get :put]
:available-media-types ["application/json"]
:available-charsets ["utf-8"]
:handle-ok (fn [_] (init-world dimensions))
:put! (fn [ctx] (orbit-world dimensions ctx))
:handle-created (fn [_] (init-world dimensions))) ; Basically just a handler like any other.
Поскольку вы не объявляете ничего в:handle-создан, по умолчанию используется пустая строка с типом содержимого text/plain.
Редактировать:
Чтобы понять больше, вы должны увидеть график решений. Там вы можете увидеть, что после обработки put!
речь идет об обработке решений new?
, если это правда, перейдите на handle-created
если ложь, перейдите к respond-with-entity?
и так далее.