2015-10-21 1 views
2

С Compojure существует ли способ перенаправления на один из определенных маршрутов, кроме необходимости форматировать URL-адрес запроса?Compojure - избегать «ручной» форматирования URL-адресов при использовании перенаправления

Например, в следующей упрощенной defroutes декларации:

(defroutes app-routes 
    ; ... 
    (GET "/something-that-may-redirect" [query-param] 
    ; parse `query-param` into `arg1` and `arg2` and: 
    (ring.util.response/redirect (format "/another-route?param1=%s&param2=%s" arg1 arg2)) 
    (GET "/another-route" [param1 param2] ...) 
    ; ... 

Здесь я должен форматировать URL для перенаправления (и обычно также имеет дело с побегом), для того, чтобы этот URL, чтобы быть впоследствии проанализирован самой Compojure и извлечь значения для param1 и param2.

Итак, вопрос в том, есть ли подход к перенаправлению и позволить Compojure форматировать URL-адрес запроса, зная, что он уже имеет информацию о аргументах? Что-то же просто, как:

(redirect "/another-route" arg1 arg2) 

который будет форматировать URL-адрес itlsef в:

"/another-route?param1=[value of arg1]&param2=[value of arg2]" 

P.S. Сама идея это не ново, конечно. Некоторые другие веб-структуры имеют схожие черты - например, с веб-рамки Колба Пайтона можно использовать url_for создать хорошо отформатированный и сбежавшего URL из базового пути и значений параметров запроса:

# for example, in Python's Flask framework 
url_for('route-name', param1='value1', param2='value2') 
+0

Я не понимаю, что вы означает «parse query-param» в arg1 и arg2 ». Вы деструктурируете/path? Query-param = x в x, какой синтаксический анализ вам нужен? –

+0

Да, я не говорю о разборе - речь идет о форматировании. – Timur

+0

Не можете ли вы просто взять всю строку запроса и выполнить '(str"/another-route? "Query-string)'? –

ответ

2

Я считаю, что это дублирующий вопрос How to convert map to URL query string in Clojure/Compojure/Ring?

Этот код достигнет цели, которую ищет плакат.

(defroutes app-routes 
    (GET "/something-that-may-redirect" [arg1 arg2] 
     (redirect (str "/another-route" "?" (ring.util.codec/form-encode {:param1 arg1 :param2 arg2})))) 
    (GET "/another-route" response (str response))) 
+0

Спасибо, очень приятно. – Timur

0

Вместо параметра уничтожения того, вы можете использовать весь запрос и извлечь строку запроса, а затем перенаправить на новый адрес со строкой запроса, приложенной:

(GET "/foo" req 
    (ring.util.response/redirect (str "/bar?" (:query-string req)))) 
+0

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

Смежные вопросы