Compojure Routes теряет информацию - PullRequest
4 голосов
/ 30 июля 2011

Мой код:

(defn json-response [data & [status]]
    {:status (or status 200)
     :headers {"Content-Type" "application/json"}
     :body (json/generate-string data)})

(defroutes checkin-app-handler
  (GET "/:code" [code & more] (json-response {"code" code "params" more})))

Когда я загружаю файл в repl и запускаю эту команду, параметры кажутся пустыми:

$ (checkin-app-handler {:server-port 8080 :server-name "127.0.0.1" :remote-addr "127.0.0.1" :uri "/123" :query-string "foo=1&bar=2" :scheme :http :headers {} :request-method :get})
> {:status 200, :headers {"Content-Type" "application/json"}, :body "{\"code\":\"123\",\"params\":{}}"}

Что я делаю не так?Мне нужно получить строку запроса, но карта параметров всегда пуста.

1 Ответ

5 голосов
/ 31 июля 2011

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

(ns n
  (:require [ring.middleware.params :as rmp]))

(defroutes checkin-app-routes
  (GET "" [] ...))

(def checkin-app-handler
  (-> #'checkin-app-routes
      rmp/wrap-params
      ; .. other middlewares
      ))

Обратите внимание, что использование var (#'checkin-app-routes) не является строго необходимым, но оно заставляет закрывать маршруты, обернутые в промежуточное ПО, воспринимать изменения при переопределении маршрутов.

IOW вы также можете написать

(def checkin-app-handler
  (-> checkin-app-routes
      rmp/wrap-params
      ; .. other middlewares
      ))

но затем вам нужно переопределить обработчик, когда интерактивно переопределяете маршруты.

...