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? и так далее.

Другие вопросы по тегам