Несколько необязательных параметров в маршрутах Luminus/Compojure?

Я хотел бы создать маршрут, который имеет несколько необязательных параметров, определяемых наличием «ключевого слова» в URL-адресе и обрабатываемых в любом порядке.

Примеры:

http://localhost:3000/service1/param1/value1/param2/value2
http://localhost:3000/service1/param2/value2/param4/value4/param1/value1

Это вообще возможно? Я мог бы представить себе макрос для создания маршрутов, но это создает по крайней мере факториал маршрутов. Звонки будут поступать, может быть, 1 раз в час, поэтому я могу справиться с медленным временем отклика. Но разумно ли использовать макрос для создания 5000 маршрутов по 7 необязательным параметрам?


person user1559027    schedule 12.05.2014    source источник
comment
Вы можете тривиально посмотреть на путь и проанализировать param1/value1/param2/value2 .. в карту {:param1 value1, :param2 value2 ...}   -  person Diego Basch    schedule 12.05.2014


Ответы (1)


Вам нужно написать или сгенерировать собственную функцию-обработчик, которая разбирает строку uri на параметры, сортирует их в правильном порядке и вызывает с ними ваши целевые обработчики.

Поскольку вы используете кольцо, строку uri можно найти под ключом :uri в карте запроса кольца.

Compojure нельзя использовать для отправки, потому что он не предназначен для работы так, как вы хотите.

Вот упрощенный пример, когда целевой обработчик вызывается с хэш-картой проанализированных параметров, чтобы проиллюстрировать идею:

(defn handle
  [{:keys [uri] :as request}]
  (let [[root & more] (keep not-empty (clojure.string/split uri #"/")]
    (if (= "service1" root)
      (->> more
           (partition 2)
           (reduce (fn [acc [k v]]
                     (assoc acc
                       (keyword k) v) ;; TODO: parse value if necessary
                     )
                   {})
           ;; TODO: invoke your handler fn here
           )
      ;; TODO: invoke compojure handler for other routes with request here
      )))

(handle {:uri "/service1/param2/value2/param4/value4/param1/value1"})
;; {:param1 "value1", :param4 "value4", :param2 "value2"}
person Leon Grapenthin    schedule 12.05.2014